我想知道如何在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
。
能否实现我想要的? (我会喜欢一个例子)
答案 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。:我不建议让模块通过共享全局变量进行通信,尤其是在这种情况下,加载模块的顺序很重要时。最好提供方法require
和A.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模块。