[英]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.