在从我的Lua脚本调用的C函数中,我luaL_ref
用来存储对函数的引用.但是,如果我然后尝试使用返回的整数索引从不是从相同状态派生的不同线程获取该函数,那么我得到的全部是nil
.这是最简单的示例,似乎证明了这一点:
// Assumes a valid lua_State pL, with a function on top of the stack int nFunctionRef = luaL_ref(pL, LUA_REGISTRYINDEX); // Create a new state lua_State* pL2 = luaL_newstate(); lua_rawgeti(pL2, LUA_REGISTRYINDEX, nFunctionRef); const char* szType = luaL_typename(pL2, -1);
我发现szType
那时包含值'nil'.
我的理解是注册表是在所有C代码之间全局共享的,所以任何人都可以解释为什么这不起作用?
如果注册表不是以这种方式全局共享的,那么如何从其他脚本访问我需要的值?
注册表只是Lua状态中的普通表,因此两个不相关的Lua状态无法访问同一个注册表.
正如Kknd所说,你必须提供自己的机制.一个常见的技巧是创建一个不执行任何代码的额外状态,它仅用作存储.在您的情况下,您将使用C代码中的额外状态注册表.遗憾的是,没有可用的方法在两个状态之间复制任意值,因此您必须展开任何表.
复制功能尤其困难,如果您正在使用注册表,您可能需要跟踪用于存储它的状态,并在原始状态下执行它,从而有效地将其转换为跨状态调用,而不是移动功能.