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 の方がいいなという感じです。

广告
将在 10 秒后关闭
bannerAds