1个不稳定版本
使用旧的Rust 2015
0.4.2 | 2018年3月28日 |
---|
#2359 in Rust模式
338 每月下载量
用于 5 crates
155KB
3K SLoC
针对Lua的高层零成本绑定
Lua是一种解释型编程语言。此crate允许您执行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脚本调用它们。有关更多信息,请参阅
Function
结构体。例如,如果您将全局变量foo
的值设置为Rust函数,则您可以从Lua中使用foo()
调用它。 -
类似地,您可以将全局变量的值设置为Lua函数,然后从Rust中调用它。函数调用可以返回一个值。
您使用哪种方法取决于您希望向Lua脚本公开哪个API。
推送和加载值
Rust和Lua之间的接口涉及两个方面
- 将值从Rust发送到Lua,这称为推送值。
- 将值从Lua发送到Rust,这称为加载值。
推送(即从Rust发送到Lua)可以使用set
方法来完成。
lua.set("a", 50);
根据情况,您可以推送实现Push
特质或PushOne
特质的值。
- 整数、浮点数和布尔值。
String
和&str
。- 任何参数可加载且返回类型可推送的Rust函数或闭包。有关更多信息,请参阅
Function
结构体的文档。 AnyLuaValue
结构体。此枚举表示Lua中的任何可能值。LuaCode
和LuaCodeFromReader
结构体。由于推送这些结构体可能导致错误,您需要使用checked_set
而不是set
。- 内容可推送的
Vec
和HashMap
。 - 作为特殊情况,
Result
只能作为Rust函数或闭包的返回类型推送。如果它们包含错误,则认为Rust函数调用失败。 - 作为特殊情况,当它们是Rust函数或闭包的返回类型时,元组可以被推送。它们实现了
Push
但没有实现PushOne
。 - 待办事项:userdata
加载(即从Lua发送到Rust)可以使用get
方法来完成。
let a: i32 = lua.get("a").unwrap();
您可以加载实现LuaRead
特质的值。
- 整数、浮点数和布尔值。
String
和StringInLua
(即&str
的等效项)。加载后者没有成本,而加载一个String
则会进行分配。- 任何函数(Lua或Rust),使用
LuaFunction
结构体。然后可以使用它来执行函数。 AnyLuaValue
结构体。此枚举表示Lua中的任何可能值。LuaTable
结构体。此结构体表示Lua中的表,其中键和值可以是不同类型。然后可以迭代表,并加载或修改单个元素。- 作为特殊情况,当它们是Lua函数的返回类型或
execute
的返回类型时,元组可以被加载。 - 待办事项:userdata
依赖项
~470–700KB
~18K SLoC