为什么文档说 `__index` 在 table 中查找?

Why does the doc say `__index` is looked up in the table?

来自Lua 5.3 doc:

__index: The indexing access table[key]. ... The metamethod is looked up in table.

它对 __newindex 说了同样的话,但对任何其他元方法都不是。

如果这是真的(事实并非如此),那将是与之前版本 Lua 的重大差异。如我所料,以下代码输出 nil,但与文档不一致。

#!/usr/bin/env lua5.3

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

明确一点:如果文档是正确的,我希望上面代码中的 t0 只需要一个 __index 字段,而不需要 t0.a 的实际元表 [= =21=]。那么有人知道文档发生了什么事吗?

您错误地解释了该术语的含义。说它是 "metamethod Y is looked up in X" 并不意味着它在 X table 中搜索名为 Y 的条目。这意味着它获取 X 的元 table 并查找名为 Y 的条目,如同 rawget(getmetatable(X) or {}, "Y"),如文档中指定的那样。

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

First, Lua will check the first operand (even if it is valid). If that operand does not define a metamethod for __add, then Lua will check the second operand.

它不是在询问第一个(或第二个)操作数是否有方法__add;它询问他们是否有 元方法 __add.

正如您从 __add 示例中看到的那样,您必须指定它尝试从哪个操作数中获取元方法,以及以何种顺序获取元方法。对于 table[key],文本的重点是不尝试从 key 获取元方法,仅从 table 获取元方法。这似乎有点明显,但完整总比不完整好。