【发布时间】:2018-11-14 04:43:52
【问题描述】:
我现在有一个非常令人费解的设置。我有一个常规函数,它在“字符串”和“数字”键下返回一个包含函数的表:
function defGeneric()
local function funcNumber(a)
return 2*a^2
end
local function funcString(a)
return a.." - test"
end
local returnTable={}
returnTable["number"]=funcNumber
returnTable["string"]=funcString
return returnTable
end
而且效果很好。但是我现在要做的是使该函数返回的表可调用。为了说明,假设我们有v=defGeneric()。具体来说:
- 如果使用字符串
str调用v,则返回v["string"](str)的结果 - 如果
v被一个数字n调用,返回v["number"](n)的结果
这显然是元表的工作,所以我可以(在我的函数中)添加代码来设置元表:
local metaTable = {
__call = function (...) -- "call" event handler
return
end
}
setmetatable(returnTable,metaTable)
但我不知道在返回语句之后我会放什么。我不认为我可以引用returnTable,因为这个表会这样调用:
v=defGeneric()
v("test")
而且我需要引用v 的“字符串”函数(一个程序中当然可以有多个defGeneric() 表)。
我认为这里的答案可能是一些self 技巧,但我不知道该怎么做。如何从元表中引用元表的表?
【问题讨论】:
-
__call = function(t,x) return t[type(x)](x) end -
@EgorSkriptunoff 刚刚想通了!谢谢!将其发布为答案,我会接受。