通过 require 在不同的 Lua 状态之间共享全局变量

我正在寻找一种方法,在不同的 Lua 状态之间共享特定 Lua 脚本(在本例中为 test.lua)的全局变量。

下面是我的简单示例代码:

test.lua 中:

num = 2

main.cpp 中:

#include <iostream>
#include <lua.hpp>
int main()
{
    lua_State *L1 = luaL_newstate(); //script A
    luaL_openlibs(L1);
    lua_settop(L1, 0);
    luaL_dostring(L1, "require('test') num = 5");

    lua_State *L2 = luaL_newstate(); //script B
    luaL_openlibs(L2);
    lua_settop(L2, 0);
    luaL_dostring(L2, "require('test') print(num)");

    lua_close(L1);
    lua_close(L2);
}

我期望得到 5,但实际却得到了 2

通过 require 来在不同的 lua_State* 之间共享全局变量是不可能的吗?

补充:

如果不可能,那么是否在 C++ 中使用 luaL_loadfile 打开 test.lua,然后创建 getter/setter 方法来共享变量 num 会是一个好主意呢?

例如,像这样:

脚本 A:

script = my.Script("test")
script:setVar("num", 5)

脚本 B:

script = my.Script("test")
print(script:getVar("num"))

我想知道您对这种设计的看法,作为 require 的替代方案。

点赞
用户734069
用户734069

两个独立的 lua_State 完全彼此独立,一个不能直接影响另一个的任何操作。你可以将一些 C 代码暴露给其中一个以允许其修改另一个,或者它们都可以接入一些外部资源(如文件),以便它们分享数据。

但是除此之外,不,它们不能互相交互。

最好的方法是不要将它们作为单独的 lua_State

2018-07-14 05:28:56
用户567650
用户567650

虽然 Lua 状态默认是独立的,但一些绑定库提供了将信息从一个状态传递到另一个状态的功能。例如,在 sol 中,有一些方法可以将相当任意的 Lua 数据(包括函数)序列化为 C++ 数据。然后,您可以将该数据反序列化到另一个 Lua 状态中,以有效地复制它(代码链接)。

但是,最终您仍然会有两个副本。您不能直接从一个 Lua 状态修改另一个状态。

你提到的最后一点是有道理的,即暴露一些 getter/setter。您可以在 C/C++ 中存储一些数据,并使得两个不同的 Lua 状态能够访问它。但是,您仍然需要将该数据分别绑定到每个虚拟机上。

2020-05-20 18:50:32