在Lua中捕获对现有功能的调用

时间:2013-01-06 15:43:17

标签: lua mocking metatable

我想创建一个简单的模拟表,告诉我试图从中调用的是什么。

我的第一次尝试是:

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”)?

1 个答案:

答案 0 :(得分: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

您收到错误是因为它试图调用结果,但它目前是关键。