【发布时间】:2013-05-05 18:34:41
【问题描述】:
我无法理解为什么 __index 元方法的行为在这些示例之间存在差异:
A = { __index = A }
function A:speak()
print("I'm an A")
end
An_A = setmetatable({},A)
An_A:speak()
将引发以下错误:lua: l.lua:8: attempt to call method 'speak' (a nil value)
虽然
B = { __index = function(t,key) return B[key] end }
function B:speak()
print("I'm an B")
end
An_B = setmetatable({},B)
An_B:speak()
将按预期执行,输出I'm an B。
为了理解为什么会这样,我阅读了 PiL 的 this 部分。它指出:
使用 __index 元方法进行继承是如此普遍,以至于 Lua 提供了一个快捷方式。尽管有这个名字,__index 元方法确实 不需要是一个函数:它可以是一个表,而不是。当它是一个 函数,Lua 用表和缺席键作为它的调用它 论据。 当它是一个表时,Lua 会重做对该表的访问。
我对此的理解是,在涉及“A”的 sn-p 中,__index = A 导致在表A 中完成访问(根据上述引用的粗体部分)。如果是这种情况,我不明白为什么找不到与键 "speak" 关联的函数。为了尝试解决这个问题,我决定在B sn-p 中实现函数方法,它返回与B 中的key 关联的值,并且它起作用了。当然__index = A 和(改编自B)__index = function(t,key) return A[key] end 具有相同的效果。
任何澄清将不胜感激。
【问题讨论】: