【发布时间】:2012-10-28 03:27:05
【问题描述】:
这可能是一个简单的问题,但我很难过。这是针对 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++ 中查看插件变量吗?
谢谢!
【问题讨论】:
-
什么是
luaW_push?这不是标准的 Lua 代码。 -
我们正在使用 LuaWrapper (bitbucket.org/alexames/luawrapper/src) 的修改版本来帮助我们进行绑定,这是一个将用户数据推入堆栈的函数。我试图删除大部分自定义内容,但错过了。
-
从 Lua 脚本调用 c++ 函数时,是否将字符串“plugin”推回堆栈?