在lua中使用require后缺少全局变量

时间:2019-05-21 08:28:20

标签: c++ lua

问题在于,“ 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,没什么特别的。

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。 由于复制/粘贴重复,因此会在第二次创建lua vm。这相当令人困惑,因为如果没有“ require”,一切都会好起来的。这完全是巧合。

我从中学到的是:总是仔细检查复制/粘贴代码。