如何将一个函数推入 Lua 的全局空间 _G 中?

TLDR; 我希望能够从\ _G范围内调用我的函数,以便我可以通过解析字符串列表来调用函数。这可能会因框架要求“package.seeall”而变得更加严重。

我正在使用luci框架,这是OpenWRT路由器的UCI前端。为了在解析特定UCI值时调用自定义函数,我创建了与返回值相同的名称的函数,并通过\ _G调用它们。

解析的数据类似于:

data = {Name="value"}

我的代码看起来像这样:

function main()
    local pageValues={modules={}}
    for i,x in pairs(data) do
        --这是引发错误的部分
        pageValues.modules[x]=_G[x]()
        --当“newValue=_G [x]()”时也引发错误
    end
end

function value()
--当使用“local function value()”时也不起作用
    return 'YEA'
end

返回给我的错误是attempt to call field '?' (a nil value)。当我直接传递字符串“value”并使用pageValues.modules [ 'value'] = _G ['value']()时,我收到“attempt to call field' value'(a nil value)”的错误。当我像这样创建一个虚拟变量

dummy = 'value'
pageValues.modules[dummy]=_G[dummy]()

我会收到“attempt to call field '?' (a nil value)” 的错误。如果我使用local dummy ='value',情况也一样。

当我解析\ _G以查看其中是否包含任何函数时,发现它们不在其中。 注意 Luci自动调用package.seeall,我不知道这是否会影响我的全局变量。但是,这可能在回答此问题时很重要。

我最迫切的需求是正确运行此函数。我的次要兴趣是如何确定Lua的作用域,以便以后能够解决LuCI中的沙箱问题。

点赞
用户90511
用户90511

虽然你的代码并不是一个可执行的完整示例,很难理解正在发生什么,但有一件事可能会发生,就是如果你定义全局变量的模块调用了 module 函数,那么每当你尝试设置全局变量时它会在模块表中设置一个键。此外,如果你使用 package.seeall 参数运行模块,则全局赋值仍然会被重定向,唯一的区别是该模块可以读取其他预定义的全局变量。

如果是这种情况,你可以通过从适当的模块而不是全局表中读取值来解决问题,或者在创建这些值时直接设置 _G 来解决问题。

2013-01-13 15:46:57