为什么文档上说 `__index` 要在表中查找?

来自 Lua 5.3 文档:

__index: 索引访问 table[key]。... 这个元方法将在 table 中查找。

对于 __newindex,文档也有同样的说明,但对于其他任何元方法都没有。尽管这并不正确,但如果是这样的话,它将成为 Lua 先前版本的重要变更。以下代码输出 nil,正如我预期的那样,但它与文档不一致。

#!/usr/bin/env lua5.3

local proto = {a = 54}
local t0 = {__index = proto}
print(t0.a)

明确一下:如果文档是正确的,我希望上面的代码中的 t0 只需要一个 __index 字段而没有实际的元表,那么 t0.a 就是 54。那么,有人知道文档出了什么问题吗?

点赞
用户734069
用户734069

你误解了这个术语的含义。说它是“元方法 YX 中查找”并不意味着它会在X表中搜索名为 Y 的条目。这意味着它取得X的元表,并查找一个名为 Y 的条目,就好像在文档中指定的那样,即 rawget(getmetatable(X) or {}, "Y")

这个术语在元方法的描述中反复使用。例如:

首先,Lua会检查第一个操作数(即使它是有效的)。如果该操作数没有定义__add的元方法,那么Lua会检查第二个操作数。

它并不是在问第一个(或第二个)操作数是否有一个名为__add的方法;它询问它们是否有一个名为_元方法___add

__add的例子中可以看出,你必须确定它尝试从哪个操作数和以哪个顺序获取元方法。对于table[key],文本的重点是它不会尝试从key获取元方法,只会从table获取。这可能有点显而易见,但完整性比不完整性更好。

2018-04-21 23:52:34