我无法理解为什么__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 的这一部分。它指出:
__index 元方法用于继承是如此普遍,以至于 Lua 提供了一个快捷方式。尽管有这个名字,__index 元方法不需要是一个函数:它可以是一个表,而是。当它是一个函数时,Lua 用表和缺失的键作为它的参数来调用它。当它是一个表时,Lua 会重做对该表的访问。
我对此的理解是,在涉及“A”的片段中,__index = A
导致在表中完成访问A
(根据上述引用的加粗部分)。如果是这种情况,我不明白为什么"speak"
找不到与密钥关联的功能。为了尝试解决这个问题,我决定在代码片段中实现函数方法,它返回与inB
关联的值,并且它起作用了。肯定和 (改编自)具有相同的效果。key
B
__index = A
B
__index = function(t,key) return A[key] end
任何澄清将不胜感激。