16 个版本
使用旧的 Rust 2015
0.4.2 | 2024年4月16日 |
---|---|
0.4.1 | 2017年9月19日 |
0.4.0 | 2017年8月17日 |
0.3.1 | 2016年12月26日 |
0.1.3 | 2015年3月29日 |
#479 in 开发工具
681 每月下载量
在 5 crates 中使用
155KB
3K SLoC
Lua 的高级零成本绑定
Lua 是一种解释型编程语言。这个包允许你执行 Lua 代码。
通用用法
为了执行 Lua 代码,你首先需要一个 Lua 上下文,在这个库中用 `Lua` 结构体 来表示。然后你可以在这个对象上调用 `execute` 方法。
例如
use hlua::Lua;
let mut lua = Lua::new();
lua.execute::<()>("a = 12 * 5").unwrap();
此示例将值 60
放入全局变量 a
中。所有全局变量的值都存储在 Lua
结构体中。如果你在同一个上下文中执行多个 Lua 脚本,每个脚本都将能够访问先前脚本修改过的相同全局变量。
为了真正有用地使用 Lua,我们需要让 Lua 和 Rust 互相通信。这可以通过以下四种方式实现
-
你可以使用
Lua
结构体上的方法,通过get
和set
方法读取或写入全局变量的值。例如,你可以使用 Lua 脚本来写入全局变量,然后从 Rust 中读取它,或者从 Rust 中写入全局变量,然后从 Lua 脚本中读取它。 -
使用
execute
方法执行的 Lua 脚本可以返回一个值。 -
您可以将全局变量的值设置为Rust函数或闭包,然后可以使用Lua脚本来调用它们。有关更多信息,请参阅《code>Function结构体。例如,如果您将全局变量
foo
的值设置为Rust函数,则可以从Lua使用foo()
来调用它。 -
同样,您可以将全局变量的值设置为Lua函数,然后从Rust中调用它。函数调用可以返回一个值。
您使用哪种方法取决于您希望向Lua脚本公开哪个API。
推送和加载值
Rust和Lua之间的接口涉及两个方面
- 从Rust将值发送到Lua,这被称为推送值。
- 从Lua将值发送到Rust,这被称为加载值。
可以使用《code>set方法进行推送(即从Rust发送到Lua)
lua.set("a", 50);
您可以根据情况推送实现Push
特例或PushOne
特例的值
- 整数、浮点数和布尔值。
String
和&str
。- 任何Rust函数或闭包,其参数是可加载的,其返回类型是可推送的。有关更多信息,请参阅《code>Function结构体的文档。
- 《code>AnyLuaValue结构体。这个枚举表示Lua中的任何可能值。
- 《code>LuaCode和《code>LuaCodeFromReader结构体。由于推送这些结构体可能导致错误,因此您需要使用
checked_set
而不是set
。 - 其内容是可推送的
Vec
和HashMap
。 - 作为特殊情况,
Result
只能作为Rust函数或闭包的返回类型推送。如果它们包含错误,则Rust函数调用被视为失败。 - 作为特殊情况,当它们是Rust函数或闭包的返回类型时,元组可以被推送。它们实现
Push
但不实现PushOne
。 - TODO:用户数据
加载(即从Lua发送到Rust)可以使用《code>get方法完成
let a: i32 = lua.get("a").unwrap();
您可以加载实现LuaRead
特例的值
- 整数、浮点数和布尔值。
String
和《code>StringInLua(即&str
的等效项)。加载后者没有成本,而加载String
则执行分配。- 任何函数(Lua或Rust),带有《code>LuaFunction结构体。然后可以使用它来执行函数。
- 《code>AnyLuaValue结构体。这个枚举表示Lua中的任何可能值。
- 《code>LuaTable结构体。这个结构体表示Lua中的表,其中键和值可以是不同类型的。然后可以迭代该表,并加载或修改单个元素。
- 作为特殊情况,当元组是 Lua 函数的返回类型或
execute
的返回类型时,可以加载元组。 - TODO:用户数据
依赖项
~470–700KB
~18K SLoC