如何在Lua脚本之间共享全局变量

时间:2018-07-13 13:17:10

标签: lua

我想知道如何在Lua脚本之间共享全局变量。

我尝试自己使用require来执行此操作,但是它没有按预期工作。

这是我简单的示例代码。

test.lua

num = 2

A.lua

require(`test`);
num = 5

B.lua

require(`test`);
print(num);

如果我先运行A.lua,然后运行B.lua,则会得到以下结果:

2

但是我希望得到5,因为我在2中将变量值修改为A.lua

能否实现我想要的? (我会喜欢一个例子)

3 个答案:

答案 0 :(得分:1)

您当前正在执行以下操作:

lua A.lua
> lua process starts
> loading A.lua
> loading test.lua (because it is required by A.lua)
> set global "num" to value 2
> set global "num" to value 5
> lua process exits (A.lua finished)
lua B.lua
> lua process starts
> loading B.lua
> loading test.lua (because it is required by B.lua)
> set global "num" to value 2
> print global "num" (which was set to 2 by test.lua)
> lua process exits (B.lua finished)

要打印值5,您的脚本应如下所示:

-- test.lua
num = 2

-- A.lua
require("test")
num = 5

-- B.lua
require("test")
require("A")
print(num)

这将导致:

lua B.lua
> lua process starts
> loading B.lua
> loading test.lua (because it is required by B.lua)
> set global "num" to value 2
> loading A.lua (because it is required by B.lua)
> skip loading test.lua (has already been loaded)
> set global "num" to value 5
> print global "num"
> lua process exits (B.lua finished)

编辑: 我看到您使用的是Lua的C Api,而不是Lua二进制文件来执行脚本。使用编程API,您应该能够通过使用相同的lua状态(通常存储在C变量“ L”中)执行A.lua和B.lua来获得所需的结果。

答案 1 :(得分:1)

a.lua

a = 5

b.lua

require('a')
a = 2

test.lua

require('b')
print(a)

您应该得到2,因为require链从顶部开始工作,如果您只运行每个文件,那么lua只会执行这个小的uniq执行,因此不会存在持久性差异执行,因此您需要根据需要进行执行

答案 2 :(得分:1)

没有专用功能需要C-API中的Lua模块。 [1] 因此,我将自己定位于Lua解释器中的功能dolibrary,以实现{{1} }只需从C调用Lua require函数。

N.B。:我不建议让模块通过共享全局变量进行通信,尤其是在这种情况下,加载模块的顺序很重要时。最好提供方法requireA.update_num(old),它们将B.update_num(old)的旧值作为参数并返回更新后的值。

num

将您问题中的脚本放在同一目录中,我们得到:

#include <iostream>

#include <lua.hpp>

int require(lua_State *L, char const * modname) {
    int const size = lua_gettop(L);

    lua_getglobal(L, "require");
    lua_pushstring(L, modname);

    if (lua_pcall(L, 1, LUA_MULTRET, 0) != 0) {
        std::cerr << "lua:" << lua_tostring(L, 1) << '\n';
        lua_pop(L,1);
        return 0; // Failed, nothing should be on the stack
    }

    return lua_gettop(L) - size;
}

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

    require(L, "A");
    require(L, "B");

    lua_close(L);
}

[1]有lua_requiref要求C-API中的Lua C模块。