2

そこから何が呼び出されようとしたのかを教えてくれる簡単なモックテーブルを作成したいと思います。

私の最初の試みは:

local function capture(table, key)
    print("call to " .. tostring(table) .. " with key " .. tostring(key))
    return key
end

function getMock()
    mock = {}
    mt = { __index = capture }
    setmetatable(mock, mt)

    return mock
end

今これをと呼んでいます

t = getMock()
t.foo

私が期待したように印刷します:

call to table: 002BB188 with key foo

しかし、電話をかけようとしています:

t.foo("bar")

与える:

call to table: 002BB188 with key foo
lua: test.lua:6: attempt to call field 'foo' (a string value)

今私は2つの質問があります:

  1. 例外を回避する方法、すなわち。私は何が間違っているのですか?
  2. メソッド引数(この場合は「bar」)もキャッチする方法は?
4

1 に答える 1

4

文字列ではなく、__indexハンドラーから関数を返す必要があります。

local function capture(table, key, rest)
    return function(...)
               local args = {...}
               print(string.format("call to %s with key %s and arg[1] %s",
                                   tostring(table), tostring(key),
                                   tostring(args[1])))
           end
end

-- call to table: 0x7fef5b40e310 with key foo and arg[1] nil
-- call to table: 0x7fef5b40e310 with key foo and arg[1] bar

結果を呼び出そうとしているためエラーが発生しますが、現在はそれが重要です。

于 2013-01-06T16:09:37.353 に答える