- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 Lua 5.3 的不同 luathread 中获取具有相同函数名的 luathread 函数?使用getglobal在5.1工作成功,但是在5.3下工作报错,
这段代码主要运行调用luathread函数
const char * gLua0 = "function Test() print(12) end";
const char * gLua1 = "function Test() print(23) end";
lua_State * sL0 = newLuaThread();
luaL_loadbuffer(sL0, gLua0, strlen(gLua0), nullptr);
lua_State * sL1 = newLuaThread();
luaL_loadbuffer(sL1, gLua1, strlen(gLua1), nullptr);
lua_getglobal(sL0, "Test");
lua_pcall(sL0, 0, 0, 0);
lua_getglobal(sL1, "Test");
lua_pcall(sL1, 0, 0, 0);
//---- lua 5.1的结果
12
23
//----- lua 5.3的结果
23
23
为什么结果 5.3 与 5.1 不同?
此代码是在 lua 5.1 中创建 lua 线程
lua_State * newLuaThread()
{
lua_State * sL = lua_newthread(L);
lua_pushvalue(L, -1);
int nRef = luaL_ref(L, LUA_REGISTRYINDEX);
lua_newtable(L);
lua_pushvalue(L, -1);
lua_setmetatable(L, -2);
lua_pushvalue(L, LUA_GLOBALSINDEX);
lua_setfield(L, -2, "__index");
lua_setfenv(L, -2);
lua_pop(L, 1);
return sL;
}
此代码是在 lua 5.3 中创建 lua 线程
lua_State * newLuaThread()
{
lua_State * sL = lua_newthread(L);
lua_pushvalue(L, -1);
int nRef = luaL_ref(L, LUA_REGISTRYINDEX);
lua_newtable(nLuaState);
lua_pushvalue(nLuaState, -1);
lua_setmetatable(nLuaState, -2);
lua_getglobal(nLuaState, "_G");
lua_setfield(nLuaState, -2, "__index");
lua_setupvalue(nLuaState, 1, 1);
lua_pop(L, 1);
return sL;
}
最佳答案
用 5 天时间找出正确答案是:
luaL_loadbuffer(nLuaState, nBuffer, strlen(nBuffer), nullptr);
lua_newtable(nLuaState);
lua_pushvalue(nLuaState, -1);
lua_setmetatable(nLuaState, -2);
lua_getglobal(nLuaState, "_G");
lua_setfield(nLuaState, -2, "__index");
lua_pushvalue(nLuaState, -1);
lua_setglobal(nLuaState, nChunk);
lua_setupvalue(nLuaState, -2, 1);
lua_getglobal(nLuaState, nChunk);
lua_getfield(nLuaState, -1, nFun);
lua_pcall(nLuaState, 0, 0, 0);
关于c++ - Lua5.3中pushglobaltable和setfenv的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30027596/
我正在尝试使用 setfenv 对一些函数进行沙盒处理,我收到以下输出: 123 nil 为什么调用sandboxTest()时testValue是nil,而在callSandboxedTest()中
Lua 从 setfenv() 切换有什么大不了的至 _ENV ? 在各种“新消息”来源中,这一举措被认为是 Lua 5.1 和 5.2 版本之间最重要的变化之一。 但是,PIL 和其他地方给出的示例
我正在尝试使用原始 Lua 文件进行配置,但不希望配置文件污染全局命名空间。 我遇到的问题是 dofile似乎总是在真实的全局环境中执行,所以外部文件只是将它们的所有声明都扔到 _G 中。 这是一个示
所以我有一个 Lua 脚本,我在其中设置函数的环境并定义我在环境中提供的其他函数。问题是,当我调用我在 setfenv 上执行的函数时,它在环境中调用的任何函数都使用全局 _G 环境来查找值,而不是我
我想在 lua 状态上加载一些函数,然后能够从 lua 线程调用这些函数。我试图在线程上 setfenv ,以便它们创建的变量仅限于线程并且不会出现在全局环境中。 lua_State *L = lua
如何重新创建 setfenv 的功能在 Lua 5.2 中?我在理解您应该如何使用新的 _ENV 时遇到了一些麻烦。环境变量。 在 Lua 5.1 中你可以使用 setfenv很容易地沙箱任何功能。
我是一名优秀的程序员,十分优秀!