C API和Lua类型

如果你查看一些 lua 文档,你会看到:

Lua 中有八种基本类型:nil、boolean、number、string、userdata、function、thread 和 table。

那么诸如 lua_pushunsigned()lua_pushinteger() 这样的 C API 函数是有什么用途的呢,因为 lua 数字类型通常被定义为某种浮点类型(例如 double)?为什么不只是 lua_pushnumber()

点赞
用户577603
用户577603

lua_pushintegerlua_pushnumber 的实现是相同的,除了在 pushnumber 中检查信号 NaN 值。在将整数传递给 pushinteger 之前,将其转换为 lua_Number 类型(默认为 double),然后将其推送到 Lua 栈中。

这里额外的抽象的主要优点是,类型转换的确切实现由 Lua 处理,而不是由用户处理。例如,您会注意到,对于性能原因,对于 pushunsigned 执行的强制转换比预期的要复杂一些。然而,如果您喜欢自己进行类型转换(并且您事先知道 lua_Numberlua_Integer 的类型),那么在任何地方都只需调用 pushnumber 即可,不会有任何损失。

请注意,即将到来的 Lua 5.3 计划引入整数类型到语言中,因此 API 函数之间的区别可能在那里更加重要。然而,现在为止,还无法预测此更改对 API 的最终影响。

2013-12-06 11:39:23