3

Lua を使用して、パラメーターを使用して関数を動的に呼び出そうとしています。次の方法で解析する文字列を送信したい:

  • 第1引数はクラスインスタンス「Handle」
  • 2番目は呼び出される関数です
  • 残っているのは引数だけです

「modules」は、{ string=<instance of a class> }
split() のようなテーブルであり、インデックス付きの文字列を含むテーブルを返す単純なパーサーです。

function Dynamic(msg)
    local args = split(msg, " ")
    module = args[1]
    table.remove(args, 1)
    if module then
        module = modules[module]
        command = args[1]
        table.remove(args, 1)
        if command then
            if not args then
                module[command]()
            else
                module[command](unpack(args))  -- Reference 1
            end
        else
            -- Function doesnt exist
        end
    else
        -- Module doesnt exist
    end
end

これを「ignore remove bob」で試してみると、「参照 1」によると、モジュールの「ignore」に関連付けられたインスタンスで「remove」を呼び出そうとし、テーブルに含まれる引数「bob」を与えます (単一の値)。

ただし、呼び出しの反対側では、remove 関数は引数を受け取りません。「参照1」行を次のように置き換えようとさえしました

module[command]("bob")

しかし、私は同じ結果を得ます。

引数を受け取らない他の関数は次の"bob"とおりです。

function TIF_Ignore:remove(name)
    print(name)  -- Reference 2
    TIF_Ignore:rawremove(name)
    TIF_Ignore:rawremovetmp(name)
    print(title.. name.. " is not being ignored.")
end

何が問題なのかを理解しようとしていたときに、コードに「参照 2」を追加しました。「ボブの削除を無視」するか、「参照 1」で「unpack(args)」を「ボブ」に置き換えても、「削除」の変数「名前」はまだ nil です。

4

2 に答える 2

3

コロン構文で定義された関数を呼び出したい場合は:、追加の引数、つまり期待するテーブルを渡す必要があります。与えられた特定の例では が使用されていないためself、ドット.構文に切り替えることができますが、完全な一般性が必要な場合は、以下のコードを参照してください。

function Dynamic(msg)
    local args   = split(msg, " ")
    local module = table.remove(args, 1)
    if module and modules[module] then
        module = modules[module]
        local command = table.remove(args, 1)
        if command then
            local command = module[command]
            command(module, unpack(args))
        else
            -- Function doesnt exist
        end
    else
        -- Module doesnt exist
    end
end

また、いくつかの小さな問題を修正しました。

  • 変数はlocal.
  • argsは常に非 nil です。
  • ルックアップmodules[module]が失敗する可能性があります。
  • table.remove削除された要素を返します。空のテーブルで呼び出しても問題ありません。
于 2010-03-14T15:45:46.683 に答える
3

宣言function TIF_Ignore:remove(name)は と同等function TIF_Ignore.remove(self, name)です。最初のケースでのコロンの使用に注意してください。これにより、OOP とクラスをエミュレートするための隠しパラメータが追加されます。関数を呼び出す方法では、代わりに "bob" をselfパラメーターとして渡しますname

これを修正するには、次removeのような「静的関数」を作成しますfunction TIF_Ignore.remove(name)rawremoveただし、宣言と呼び出しサイトの両方をrawremovetmp同様に変更する必要があります。もう 1 つの (より簡単な) オプションはmoduleargsテーブルから削除しないことです。これは、渡される最初のパラメーターにする必要があります。

于 2010-03-14T12:26:36.330 に答える