使用LUA中使用后缺少的全局变量

  • 本文关键字:全局变量 LUA 使用 c++ lua
  • 更新时间 :
  • 英文 :


问题是," require"关键字清除了同一文件中定义的所有全局变量。

我正在从事C 项目。我使用lua 5.3。Lua脚本样式是:

1所有LUA代码都包含1个公共库文件,几个小文件都充当函数。

2启动程序时,LUA COONMO库将被编译和执行,将其全局变量留在LUA状态。然后未执行小文件。

3当程序到达某个时刻时,将调用相关的小LUA文件(就像我说的那样,每个小文件都是函数(。公共库中定义的全局函数和变量将在小LUA文件中使用。这就是为什么我在程序启动时编译和执行公共库的原因。

4我非常确定我只使用1个lua_state。

它运行良好,直到我决定将通用库将其分为多个文件,并在主文件中使用" require"。当程序启动时,主文件将被编译和执行。

没有更改单个代码,只需添加" require"。发生了奇怪的事情:缺少所有全局变量和全局功能。当在小lua文件中调用全局函数时,"称为nil值"错误会引起。

然后,我进行了一个实验,我在主库文件中删除了所有"需要"行,事实证明,主库中定义的全局函数效果很好。然后,我需要一个空文件" simple.lua",主要库中定义的全局函数丢失,无法从小lua文件调用。

如何解释这一点?"需要"关键字如何清除同一文件中定义的所有全局变量?

在LUA库中:

require("simple")
function foo()
    return 1+1
end

在lua小文件中

return foo()

结果:尝试调用零值(全局'foo'(

删除" require",lua库:

function foo()
    return 1+1
end

结果:没有发生错误,返回2

C 侧代码:

lua common Library编译和concute:

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状态(或删除"要求"时它将无法使用(。编译后,堆栈顶部的小文件函数将保存在全局寄存器中,并带有参考变量" ref"。当调用lua小文件时,将裁判推入堆栈中,使用lua_pcall,没有什么特别的。

我自己解决了问题。由于重复的副本/糊状,LUA VM是第二次创建的。这是令人困惑的,因为如果没有"要求",一切都还好。这是一个完全巧合。

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

最新更新