1

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の範囲をどのように決定できるかということです。

4

1 に答える 1

0

実行可能ファイルが含まれていないため、コードで何が起こっているのかを理解するのは少し難しいですが、発生する可能性のあることの1つは、グローバルを定義したモジュールがmodule関数を呼び出した場合、グローバルでは、代わりにモジュールのテーブルにキーを設定します。さらに、package.seeallパラメーターを使用してモジュールを実行した場合でも、グローバル割り当てはリダイレクトされます。唯一の違いは、モジュールが他の事前定義されたグローバル変数を読み取ることができることです。

この場合、グローバルテーブルから値を読み取ろうとしない(代わりに適切なモジュールから読み取る)か_G、最初にそれらの値を作成するときに直接設定することで、問題を解決できます。

于 2013-01-13T15:46:57.537 に答える