我想创建一个简单的模拟表,告诉我试图从中调用的是什么。
我的第一次尝试是:
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)
现在我有两个问题:
答案 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
您收到错误是因为它试图调用结果,但它目前是关键。