簡體   English   中英

如何在Lua中將函數推入_G(全局空間)

[英]How to push a function into _G (gloal space) in Lua

TLDR; 我的函數無法在_G范圍內調用,因此我希望它們能夠被調用,以便可以通過解析字符串列表來調用函數。 package.seeall可能會加劇此問題package.seeall參閱框架要求的所有內容。

我正在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) attempt to call field '?' (a nil value)當我直接將其與pageValues.modules['value']=_G['value']()傳遞給字符串“ value”時,我attempt to call field 'value' (a nil value) 。這樣的虛擬變量

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

我收到attempt to call field '?' (a nil value) attempt to call field '?' (a nil value) 如果使用local dummy = 'value'

當我解析_G以查看其中是否有任何函數時,我發現它們沒有。 注意 Luci會自動調用package.seeall ,我不知道這是否與我的全局變量混淆。 但是,回答這個問題可能很重要。

我最迫切的需要是使此功能正確運行。 我的第二個興趣是如何確定Lua的范圍,以便將來解決LuCI中的沙盒問題。

由於它不是一個可執行的示例,因此很難理解代碼中正在發生的事情,但是可能發生的一件事情是,如果定義全局變量的module調用了module函數,那么只要您嘗試設置全局,它將在模塊表中設置一個鍵。 此外,如果使用package.seeall參數運行模塊,則全局分配仍將重定向-唯一的區別是模塊可以讀取其他預定義的全局變量。

如果是這種情況,您可以通過不嘗試從全局表中讀取值(而是從適當的模塊中讀取)或通過在首次創建這些值時直接設置_G來解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM