如何在 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,因为我在 A.lua 中修改了变量值。

我是否可以实现我想要的效果?(如果有示例代码我将不胜感激)

点赞
用户4515989
用户4515989

你现在正在做的是:

lua A.lua
> lua进程开始运行
> 加载A.lua
> 加载test.lua(因为它是A.lua所需的)
> 设置全局变量“num”的值为2
> 设置全局变量“num”的值为5
> lua进程退出(A.lua结束)
lua B.lua
> lua进程开始运行
> 加载B.lua
> 加载test.lua(因为它是B.lua所需的)
> 设置全局变量“num”的值为2
> 打印全局变量“num”(由test.lua设置为2)
> lua进程退出(B.lua结束)

要打印5的值,你的脚本应该像这样:

-- test.lua
num = 2

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

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

这将得到:

lua B.lua
> lua进程开始运行
> 加载B.lua
> 加载test.lua(因为它是B.lua所需的)
> 设置全局变量“num”的值为2
> 加载A.lua(因为它是B.lua所需的)
> 跳过加载test.lua(已经加载过了)
> 设置全局变量“num”的值为5
> 打印全局变量“num”
> lua进程退出(B.lua结束)

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

2018-07-13 13:44:11
用户8656476
用户8656476

a.lua

a = 5

b.lua

require('a')
a = 2

test.lua

require('b')
print(a)

你应该得到2,因为require链是从上到下工作的,如果您只运行每个文件一次,Lua将只执行此小独特执行,跨不同执行没有持久性,因此您需要根据需要require。

2018-07-13 13:54:58
用户1944004
用户1944004

没有专门的函数可以从C-API中要求Lua模块。[1]因此,我将自己的方向定位于Lua解析器中的函数dolibrary来实现require,该函数仅从C调用Lua 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);
}

与问题中的脚本在同一个目录中,我们得到:

$ clang++ -Wall -Wextra -Wpedantic -I /usr/include/lua5.2/ test.cpp -llua5.2
$ ./a.out
5

[1]有lua_requiref可以从C-API中要求Lua C模块。

2018-07-14 02:29:44