如何在 Lua 脚本之间共享全局变量
2018-7-13 13:17:10
收藏:0
阅读:141
评论:3
我想知道如何在 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 中修改了变量值。
我是否可以实现我想要的效果?(如果有示例代码我将不胜感激)
点赞
用户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
没有专门的函数可以从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
评论区的留言会收到邮件通知哦~
推荐文章
- 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 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获得需要的结果。