问题在于,“ require”关键字会清除同一文件中定义的所有全局变量。
我正在使用c ++进行项目。我使用lua 5.3。 lua脚本样式为:
1个所有lua代码都包含1个公共库文件,以及几个充当函数的小文件。
2当程序启动时,lua公共库被编译并执行,将其全局变量保持在lua状态。然后小文件将不执行编译。
3当程序到达某个点时,相关的小lua文件将被调用(正如我所说的,每个小文件都是一个函数)。通用库中定义的全局函数和变量将在小型lua文件中使用。这就是为什么我在程序启动时编译并执行公共库的原因。
4我非常确定我只使用1 lua_State。
它工作正常,直到我决定将公共库拆分为多个文件,并在主文件中使用“ require”。程序启动时,将编译并执行主文件。
未更改任何代码,只需添加“需要”即可。发生了奇怪的事情:所有全局变量和全局函数都丢失了。在较小的lua文件中调用全局函数时,会出现“称为零值”错误。
然后我做一个实验,删除主库文件中的所有“ require”行,结果发现主库中定义的全局函数运行良好。然后,我需要一个空文件“ simple.lua”,主库中定义的全局函数丢失了,无法从小的lua文件中调用它。
该如何解释? “ require”关键字如何清除同一文件中定义的所有全局变量?
在lua库中:
require("simple")
function foo()
return 1+1
end
在lua小文件中
return foo()
结果:尝试调用nil值(全局'foo')
删除“ require”后,Lua库:
function foo()
return 1+1
end
结果:没有错误发生,返回2
c ++附加代码:
lua通用库编译并执行:
int code = luaL_loadbuffer(L, s, strlen(s), "commonlib");
if(code != 0) {
std::string error = lua_tostring(L, -1);
lua_pop(L, 1);
return error;
}
code = lua_pcall(L, 0, 0, 0);
if(code > 0)
{
std::string ret = lua_tostring(L, -1);
lua_pop(L, 1);
return ret;
}
else
return ""; //empty string means no error
lua小功能文件编译:
int code = luaL_loadbuffer(L, s, strlen(s), "RULE1");
if(code != 0) {
std::string error = lua_tostring(L, -1);
lua_pop(L, 1);
return error;
}
else
{
return ""; //return empty means no error
}
两个代码中的L处于相同的lua状态(或在删除“ require”时不起作用)。编译后,堆栈顶部的小文件功能将使用参考变量“ ref”保存在全局寄存器中。 当调用lua小文件时,将ref推入堆栈,使用lua_pcall,没什么特别的。
答案 0 :(得分:0)
我自己解决了这个问题。 由于复制/粘贴重复,因此会在第二次创建lua vm。这相当令人困惑,因为如果没有“ require”,一切都会好起来的。这完全是巧合。
我从中学到的是:总是仔细检查复制/粘贴代码。