TLDR; 私の関数は_Gスコープから呼び出すことができないので、文字列のリストを解析して関数を呼び出すことができるようにしたいのです。package.seeall
これは、フレームワークで要求されることによって悪化する可能性があります。
私は、OpenWRTルーターのUCIフロントエンドであるluciフレームワークで作業しています。特定の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)
文字列「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
、それが私のグローバルを混乱させているのかどうかはわかりません。しかし、この質問に答える上で重要かもしれません。
私の最も緊急の必要性は、この関数を正しく実行することです。私の二次的な関心は、将来LuCIでサンドボクシングの問題をトラブルシューティングできるようにLuaの範囲をどのように決定できるかということです。