此第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但仍有一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目。
用 Lua 编程 | ||
第四部分。C API 第 27 章。编写 C 函数的技术 |
您永远不应将数字用作注册表中的键,因为这些键是为引用系统保留的。此系统由辅助库中的几个函数组成,这些函数允许您将值存储在注册表中,而无需担心如何创建唯一名称。(实际上,这些函数可以对任何表起作用,但通常与注册表一起使用。)
调用
int r = luaL_ref(L, LUA_REGISTRYINDEX);从堆栈中弹出值,将其存储到注册表中,并使用新的整数键,然后返回该键。我们称此键为引用。
顾名思义,我们主要在需要将对 Lua 值的引用存储在 C 结构中时使用引用。正如我们所看到的,我们永远不应将指针存储到 C 函数外部检索到的 Lua 字符串中。此外,Lua 甚至不提供对其他对象(例如表或函数)的指针。因此,我们无法通过指针引用 Lua 对象。相反,当我们需要此类指针时,我们会创建一个引用并将其存储在 C 中。
若要将与引用 r
关联的值推送到堆栈上,我们只需编写
lua_rawgeti(L, LUA_REGISTRYINDEX, r);最后,若要释放值和引用,我们调用
luaL_unref(L, LUA_REGISTRYINDEX, r);在此调用之后,
luaL_ref
可能会再次将 r
中的值作为新引用返回。
引用系统将 nil 视为特殊情况。每当您为 nil 值调用 luaL_ref
时,它不会创建新引用,而是返回常量引用 LUA_REFNIL
。调用
luaL_unref(L, LUA_REGISTRYINDEX, LUA_REFNIL);没有效果,而
lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_REFNIL);会推送一个 nil,如预期的那样。
引用系统还定义了常量 LUA_NOREF
,它是一个与任何有效引用不同的整数。它可用于将引用标记为无效。与 LUA_REFNIL
一样,任何尝试检索 LUA_NOREF
的操作都会返回 nil,任何尝试释放它的操作都不会产生任何效果。
版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 |