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 开发工具

Download history 130/week @ 2024-04-26 155/week @ 2024-05-03 173/week @ 2024-05-10 217/week @ 2024-05-17 118/week @ 2024-05-24 140/week @ 2024-05-31 131/week @ 2024-06-07 180/week @ 2024-06-14 83/week @ 2024-06-21 85/week @ 2024-06-28 112/week @ 2024-07-05 42/week @ 2024-07-12 94/week @ 2024-07-19 335/week @ 2024-07-26 135/week @ 2024-08-02 108/week @ 2024-08-09

681 每月下载量
5 crates 中使用

MIT 许可证

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 结构体上的方法,通过 getset 方法读取或写入全局变量的值。例如,你可以使用 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
  • 其内容是可推送的VecHashMap
  • 作为特殊情况,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