从C中访问函数环境中的Lua变量

这可能是一个简单的问题,但我很难过.这是Lua 5.1.

我有一个在自己的环境中运行的脚本.在那个环境中,我有一个名为“plugin”的变量,我从C中设置如下:

    lua_getfield(L, LUA_REGISTRYINDEX, getScriptId());  // Put script's env table onto the stack  -- env_table

    lua_pushstring(L, "plugin");  //                           -- env_table, "plugin"
    luaW_push(L, this);       //                               -- env_table, "plugin", *this
    lua_rawset(L, -3);        // env_table["plugin"] = *this   -- env_table

    lua_pop(L, -1);           // Cleanup                       -- <<empty stack>>

在运行我的Lua脚本之前,我设置了这样的函数环境:

 lua_getfield(L, LUA_REGISTRYINDEX, getScriptId());    // Push REGISTRY[scriptId] onto stack           -- function, table
 lua_setfenv(L, -2);                                   // Set that table to be the env for function    -- function

当我的脚本运行时,它可以按预期看到插件变量并与之交互.到现在为止还挺好.

有一次,Lua脚本调用一个C函数,在该函数中,我想看看是否设置了插件变量.

我尝试过很多东西,而且我似乎无法看到插件变量.以下是我尝试过的4件事:

lua_getfield(L, LUA_ENVIRONINDEX, "plugin");
bool isPlugin = !lua_isnil(L, -1);
lua_pop(L, 1);    // Remove the value we just added from the stack

lua_getfield(L, LUA_GLOBALSINDEX, "plugin");
bool isPlugin2 = !lua_isnil(L, -1);
lua_pop(L, 1);    // Remove the value we just added from the stack

lua_getglobal(L, "plugin");
bool isPlugin3 = !lua_isnil(L, -1);
lua_pop(L, 1);    // Remove the value we just added from the stack

lua_pushstring(L, "plugin");
bool isPlugin4 = lua_isuserdata(L, -1);
lua_pop(L, 1);

不幸的是,所有isPlugin变量都返回false.就好像从Lua调用的C函数无法在Lua环境中看到变量集.

知道如何从C中看到插件变量吗?

谢谢!

最佳答案 Lua中的每个功能都有自己的环境.它们不会继承任何人调用它们的环境.因此,如果您的C函数不使用具有此插件变量的环境,那么它将无法看到它.

点赞