#lua #builder #rlua #helper #enums #struct #default

rlua-builders

为 rlua 提供结构体/枚举的辅助函数

5 个版本

0.1.4 2020 年 6 月 28 日
0.1.3 2020 年 6 月 6 日
0.1.2 2020 年 6 月 6 日
0.1.1 2020 年 6 月 3 日
0.1.0 2020 年 6 月 2 日

#rlua 中排名第 8

MIT 许可协议

7KB

rlua-builders

Travis (.org) Crates.io

此包允许 Rust 结构体/枚举从 Lua 中轻松创建。

enum Valuables {
    Coins(u32),
    Book {name: String},
    Knowledge,
}

然后可以从 Lua 创建如下:

local a = Valuables.Coins(12)
local b = Valuables.Knowledge
local c = Valuables.Book { name = "A Dance with Dragons" }

请参阅文档以获取更多信息。


lib.rs:

rlua-builders 程序包提供了使用 rlua 进行 Rust/Lua 互操作的辅助函数。这意味着使用与 Rust 几乎相同的语法从 Lua 创建 Rust 结构体/枚举!

此程序包本身仅提供 trait 定义,但使用(默认)derive 功能提供 derive 宏来自动为任何具有 UserData 实现的结构体或枚举实现定义的 trait,为此也提供了一个 derive 宏。之后,只需调用 StructOrEnum::builder(ctx) 来创建该结构体或枚举的构建器。

这些构建器看起来像什么?

  • 对于 单元结构体:构建器只是单元值本身,因为它实现了 UserData,因此可以转换为 Lua。
  • 对于 元组结构体:构建器是一个 Lua 函数,它按顺序接收元组参数并返回结构体的 userdata。
  • 对于 普通结构体:构建器是一个 Lua 函数,它接收一个包含结构体命名参数的单一表。
  • 对于 枚举:构建器是一个表,其中每个字段都是枚举每个变体的构建器,并且它们的工作方式与上面定义的结构体构建器相同。

示例

本示例展示了如何在简单的结构体上推导和使用 LuaBuilderUserData。默认情况下,推导宏会与 rlua-builders 一同导入。有关如何与 Lua 互操作,请参阅 rlua 的更多文档。

use rlua_builders::{LuaBuilder, UserData};

#[derive(LuaBuilder, UserData, Clone, PartialEq, Debug)]
struct Person {
    name: String,
    age: u8,
}

let p = rlua::Lua::new().context(|ctx| {
    ctx.globals().set("Person", Person::builder(ctx)?)?;
    ctx.load(r#"Person { name = "Yan", age = 24 }"#).eval::<Person>()
}).unwrap();

assert_eq!(p, Person {name: "Yan".to_owned(), age: 24})

枚举的用法与此类似,只不过它们的构造函数是一个表,其中的每个函数都相当于一个结构体构建器。

此外,您可以使用 #[default=VALUE] 来指定字段的默认值。这意味着如果 Lua 中指定了 nil,则将使用该默认值,而无需手动使用 Option + unwrap_or

#[derive(LuaBuilder, UserData, Clone)]
enum Valuables {
    Coins(u32),
    Book {
        name: String,
        #[default=true]
        read: bool,
    },
    Knowledge,
}

如果稍后将其绑定到 lua

ctx.globals().set("Valuables", Valuables::builder(ctx)?)?;

可以使用与 Rust 非常类似的方式

local a = Valuables.Coins(12)
local b = Valuables.Knowledge
local c = Valuables.Book { name = "A Dance with Dragons" }

依赖项

~0.7–1.2MB
~21K SLoC