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)

现在我有两个问题:

  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 回答