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
7KB
rlua-builders
此包允许 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 函数,它接收一个包含结构体命名参数的单一表。
- 对于 枚举:构建器是一个表,其中每个字段都是枚举每个变体的构建器,并且它们的工作方式与上面定义的结构体构建器相同。
示例
本示例展示了如何在简单的结构体上推导和使用 LuaBuilder
和 UserData
。默认情况下,推导宏会与 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