为什么文档说 `__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
获取元方法。这似乎有点明显,但完整总比不完整好。
来自Lua 5.3 doc:
__index
: The indexing accesstable[key]
. ... The metamethod is looked up intable
.
它对 __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
获取元方法。这似乎有点明显,但完整总比不完整好。