通过 require 在不同的 Lua 状态之间共享全局变量
2018-7-14 5:15:4
收藏:0
阅读:204
评论:2
我正在寻找一种方法,在不同的 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 的替代方案。
点赞
用户567650
虽然 Lua 状态默认是独立的,但一些绑定库提供了将信息从一个状态传递到另一个状态的功能。例如,在 sol 中,有一些方法可以将相当任意的 Lua 数据(包括函数)序列化为 C++ 数据。然后,您可以将该数据反序列化到另一个 Lua 状态中,以有效地复制它(代码链接)。
但是,最终您仍然会有两个副本。您不能直接从一个 Lua 状态修改另一个状态。
你提到的最后一点是有道理的,即暴露一些 getter/setter。您可以在 C/C++ 中存储一些数据,并使得两个不同的 Lua 状态能够访问它。但是,您仍然需要将该数据分别绑定到每个虚拟机上。
2020-05-20 18:50:32
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

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