Rust で Lua を動かすときに使うクレートのひとつ、mlua を使ってみました。
インストール
cargo add mlua
👆をやるだけです。
Lua は apt
でインストールしたらシンボリックリンクが足りなかったとかで Rust のコンパイルに失敗したので 👆 の方法でインストールしました。
試しに動かす
Rust 内で Lua プログラムを呼ぶ
use mlua::prelude::*;
fn main() {
let lua = Lua::new();
lua.load("var = 123").exec().unwrap();
println!("var: {:?}", lua.globals().get::<_, Option<i32>>("var").unwrap());
}
var: Some(123)
Lua 内で定義させたグローバル変数を Rust で呼び出すことができました。
Rust で定義した関数を Lua で呼ぶ
use mlua::prelude::*;
fn main() {
let lua = Lua::new();
let f = lua.create_function(|_, ()| -> LuaResult<()> {
println!("hello from rust");
Ok(())
}).unwrap();
lua.globals().set("rusty_hello", f).unwrap();
lua.load("pcall(rusty_hello)").exec().unwrap();
}
hello from rust
Rust 側からグローバル変数として rusty_hello
関数を定義してあげると、Lua 内では pcall
などを使って関数呼び出しができます。Rust で書かれた関数を Lua 内部から起動できた形になります!
ちなみに、async function の定義もできます。
おわり
同じように Rust から Lua を使わせるクレート rlua も世の中にはありますが、使い心地は mlua の方がいいなという感じです。