加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:33:19 所属栏目:百科 来源:网络整理
导读:这可能是一个简单的问题,但我很难过.这是Lua 5.1. 我有一个在自己的环境中运行的脚本.在那个环境中,我有一个名为“plugin”的变量,我从C中设置如下: lua_getfield(L,LUA_REGISTRYINDEX,getScriptId()); // Put script's env table onto the stack -- env_ta
这可能是一个简单的问题,但我很难过.这是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,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);    // Remove the value we just added from the stack

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

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

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

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

谢谢!

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读