1

TLDR;我的函数不能从 _G 范围调用,我希望它们可以通过解析字符串列表来调用函数。package.seeall框架要求的a 可能会加剧这种情况。

我在 luci 框架中工作,它是 OpenWRT 路由器的 UCI 前端。为了创建在解析特定 UCI 值时调用的自定义函数,我创建了共享返回值名称的函数,这些函数通过 _G 调用。

解析后的数据如下所示:

data = {Name="value"} 

我的代码如下所示:

function main()
    local pageValues={modules={}}
    for i,x in pairs(data) do
        --here is the part that throws the error
        pageValues.modules[x]=_G[x]()
        --also throws error when "newValue=_G[x]()
    end
end

function value()
--also does not work with "local function value()"
    return 'YEA'
end

返回给我的错误是attempt to call field '?' (a nil 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 中的沙盒问题。

4

1 回答 1

0

有点难以理解代码中发生了什么,因为它不是包含的可执行示例,但可能发生的一件事是,如果您定义全局变量的模块已调用该module函数,那么每当您尝试设置global 它将改为在模块的表中设置一个键。此外,如果您使用 package.seeall 参数运行模块,则仍会重定向全局分配 - 唯一的区别是模块可以读取其他预定义的全局变量。

如果是这种情况,您可以通过不尝试从全局表中读取值(而是从相应的模块中读取)或_G在首先创建这些值时直接设置来解决您的问题。

于 2013-01-13T15:46:57.537 回答