27.3.2 References

你应该记住,永远不要使用数字作为registry key,因为这种类型的key是保留给reference系统使用。Reference系统是由辅助库中的一对函数组成,这对函数用来不需要担心名称冲突的将值保存到registry 中去。(实际上,这些函数可以用于任何一个表,但他们典型的被用于registry

调用

int r = luaL_ref(L, LUA_REGISTRYINDEX);

从栈中弹出一个值,以一个新的数字作为key将其保存到registry中,并返回这个key。我们将这个key称之为reference

顾名思义,我们使用references主要用于:将一个指向Lua值的reference存储到一个C结构体中。正如前面我们所见到的,我们永远不要将一个指向Lua字符串的指针保存到获取这个字符串的外部的C函数中。另外,Lua甚至不提供指向其他对象的指针,比如table或者函数。因此,我们不能通过指针指向Lua对象。当我们需要这种指针的时候,我们创建一个reference并将其保存在C中。

要想将一个reference的对应的值入栈,只需要:

lua_rawgeti(L, LUA_REGISTRYINDEX, r);

最后,我们调用下面的函数释放值和reference

luaL_unref(L, LUA_REGISTRYINDEX, r);

调用这个之后,luaL_ref可以再次返回r作为一个新的reference

reference 系统将nil作为特殊情况对待,不管什么时候,你以nil调用luaL_ref的话,不会创建一新的reference ,而是返回一个常量reference LUA_REFNIL。下面的调用没有效果:

luaL_unref(L, LUA_REGISTRYINDEX, LUA_REFNIL);

然而

lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_REFNIL);

像预期的一样,将一个nil入栈。

reference系统也定义了常量LUA_NOREF,她是一个表示任何非有效的reference的整数值,用来标记无效的reference。任何企图获取LUA_NOREF返回nil,任何释放他的操作都没有效果。


相关链接:
lua程序设计目录 - 中国lua开发者 - lua论坛