Lua metatable,如何转发未定义的函数?
Lua metatable, how to forward undefined functions?
我有一个空的 table,我想将其用作另一个位置的另一组函数的 "gateway"。
tbl = {}
我想将此 table 中的调用函数作为字符串传递到其他地方:
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)
如何通过 table 转发未定义的函数而不引发错误?
编辑:更多细节
我正在尝试在一个 table 中定义并调用一个函数:
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")
好的,根据您更新的详细信息,您希望lua翻译此电话
someLib.doSomething(name, age, telephone)
进入
someOtherLib.invoke("someLib.doSomething", name, age, telephone)
幕后。你所拥有的已经差不多了,你只需要 return 新创建的函数返回:
__index = function(tbl, name)
tbl[name] = function(...)
return someOtherLib.invoke("someLib."..name, ...)
end
-- return tbl[name] works too, I used rawget to indicate
-- no further __index lookup should be done
return rawget(tbl, name)
end
现在,如果您的 someOtherLib
只是一个 table 函数,lhf 的建议也行得通
setmetatable(tbl, {__index = someOtherLib})
现在,如果您的 someOtherLib
提供了某种方式来获取您想要调用的函数,而无需实际调用它,__index
可以在不创建额外的闭包包装器的情况下转发它
__index = function(tbl, name)
tbl[name] = someOtherLib.getFuncByName(name)
return tbl[name]
end
此处不需要 __call
元方法。
我有一个空的 table,我想将其用作另一个位置的另一组函数的 "gateway"。
tbl = {}
我想将此 table 中的调用函数作为字符串传递到其他地方:
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)
如何通过 table 转发未定义的函数而不引发错误?
编辑:更多细节
我正在尝试在一个 table 中定义并调用一个函数:
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")
好的,根据您更新的详细信息,您希望lua翻译此电话
someLib.doSomething(name, age, telephone)
进入
someOtherLib.invoke("someLib.doSomething", name, age, telephone)
幕后。你所拥有的已经差不多了,你只需要 return 新创建的函数返回:
__index = function(tbl, name)
tbl[name] = function(...)
return someOtherLib.invoke("someLib."..name, ...)
end
-- return tbl[name] works too, I used rawget to indicate
-- no further __index lookup should be done
return rawget(tbl, name)
end
现在,如果您的 someOtherLib
只是一个 table 函数,lhf 的建议也行得通
setmetatable(tbl, {__index = someOtherLib})
现在,如果您的 someOtherLib
提供了某种方式来获取您想要调用的函数,而无需实际调用它,__index
可以在不创建额外的闭包包装器的情况下转发它
__index = function(tbl, name)
tbl[name] = someOtherLib.getFuncByName(name)
return tbl[name]
end
此处不需要 __call
元方法。