如何从其他脚本中访问本地表变量

我的代码:

lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_settop(L, 0);
//脚本 A
luaL_dostring(L, "A = {} A.num = 3");
//脚本 B
luaL_dostring(L, "B = {} function B.update() return A.num * 2 end");
//脚本 C
luaL_dostring(L, "print(B.update())");
lua_close(L);

结果为:6

但是,如果我将表 'A' 和 'B' 设为本地变量,代码如下:

lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_settop(L, 0);
//脚本 A
luaL_dostring(L, "local A = {} A.num = 3");
//脚本 B
luaL_dostring(L, "local B = {} function B.update() return A.num * 2 end");
//脚本 C
luaL_dostring(L, "print(B.update())");
lua_close(L);

它不会输出任何内容。

如何使第二个代码工作,并且在两者之间,更推荐哪种设计?

附加问题:将所有函数和变量放在每个'.lua'文件中的唯一命名表中,是Lua中避免文件之间命名冲突的常见技术吗?

点赞
用户107090
用户107090

本地变量是定义它们的脚本的私有变量。这就是整个目的。

如果想从脚本中导出某些东西,请返回它。定义库的脚本通常会返回一个表。这比污染全局环境要礼貌得多。

2018-07-17 11:46:14
用户1944004
用户1944004

正如 Luiz Henrique 已经提到的那样,局部变量不能在其作用域之外访问,并且使用硬编码的名称污染全局环境是不礼貌的。

相反,您可以使用我在我的另一个问题回答中已经介绍的技巧。使用luaL_loadstring而不是luaL_dostring将脚本加载到函数中,并将此函数注册为 package.preload 中的字段。然后,在您的块内,您可以轻松地将预加载模块require到局部变量中。

#include <lua.hpp>

int main() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    lua_settop(L, 0);

    lua_getglobal(L, "package");
    lua_getfield(L, -1, "preload");

    // Script A
    luaL_loadstring(L, "return { num = 3 }");
    lua_setfield(L, -2, "A");

    // Script B
    luaL_loadstring(L, "local A = require('A')\n"
                       "return { update = function() return A.num * 2 end }");
    lua_setfield(L, -2, "B");

    // Script C
    luaL_dostring(L, "local B = require('B')\n"
                     "print(B.update())");

    lua_close(L);
}

这也应该回答了您的其他问题:不,使用上述描述的模块即可。

2018-07-17 23:13:08