注册表的描述,借用PIL中的一段话:
registry 一直位于一个由 LUA_REGISTRYINDEX 定义的值所对应的假索引(pseudo-index)的位置。一个假索引除了他对应的值不在栈中之外,其他都类似于栈中的索引。Lua API 中大部分接受索引作为参数的函数,也都可以接受假索引作为参数—除了那些操作栈本身的函数,比如 lua_remove,lua_insert。例如,为了获取以键值 "Key" 保
存在 registry 中的值,使用下面的代码:
lua_pushstring(L, "Key");
lua_gettable(L, LUA_REGISTRYINDEX);
由于这个表是所有的lua库所共享的,所以key值也一定要注意。云大也给了一些去key值的参考方法。
函数中,取注册表键值有这样的代码,可以看出注册表存储在 global_State 结构的 l_registry 变量中
static TValue *index2addr (lua_State *L, int idx)
else if (idx == LUA_REGISTRYINDEX) /*注册表索引*/
return &G(L)->l_registry;
注册表这个量在lua CApi可以访问,

本文介绍了Lua5.3中的注册表,它是一个全局共享的存储区域,可通过LUA_REGISTRYINDEX访问。全局变量_G实际上是通过注册表中LUA_RIDX_GLOBALS键对应的表来实现的。同时,每个chunk有一个_ENV变量,其默认值为_G,用于定义全局环境。修改(Environment)_ENV不会影响全局_G,除非_ENV直接指向_G。为了保持模块间的影响最小,推荐使用local变量,并通过_G和元表来管理全局变量。
最低0.47元/天 解锁文章
5829

被折叠的 条评论
为什么被折叠?



