我有一个空表,我想将它作为另一个位置的另一组函数的“网关”。
tbl = {}
我想将此表中的调用函数作为字符串传递到其他地方:
tbl.someMethod("hello")
我已经尝试过,但成功有限。
hand = {
__index = function(tbl, name)
hand[name] = function(...)
passToSomewhere(name, ...)
end
end,
__call = function(tbl, name, ...)
hand[name](...)
end
}
setmetatable(tbl, hand)
tbl.someFunction("hello!", someTbl, someNumber)
如何通过表转发未定义的函数而不会引发错误?
编辑:更多细节
我试图在一次调用中定义和调用表中的函数:
tbl = {}
hand = {
__index = function(tbl, name)
print(name)
tbl[name] = function(...)
print(...)
end
end
}
setmetatable(tbl, hand)
s,e = pcall(tbl.help,"banana","goat")
print(s)
s,e = pcall(tbl.help,"banana","goat")
print(s)
此代码确实有效,但第一个 pcall 将引发错误,因为尚未定义该函数。
假设我想使用一个我知道更新很多的库并保持我的脚本兼容,并且这个库可能不存在于我的计算机上。我想通过某个接口转发对该库的调用,但我仍然希望能够以相同的方式调用这些函数。
--For example I would like to call this function like this:
someLib.doSomething(name, age, telephone)
--Instead of passing it through another function:
someOtherLib.invoke("someLib.doSomething", name, age, telephone)
这可能吗?
编辑2:
谢谢@greatwolf!
这是我的工作测试代码。
tbl = {}
hand = {
__index = function(tbl, name)
tbl[name] = function(...)
return print(name, ...)
end
return rawget(tbl, name)
end
}
setmetatable(tbl, hand)
tbl.help("banana","goat")