来自Lua 5.3 doc:
__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
}}。那么有谁知道文档会发生什么?
答案 0 :(得分:2)
您错误地解释了该术语的含义。要说它是" metamethod Y
在X"并不意味着它在X表中搜索名为Y
的条目。这意味着它获取X的metatable并查找名为Y
的条目,就像rawget(getmetatable(X) or {}, "Y")
一样,如文档中所指定的那样。
该术语在元方法描述中重复使用。例如:
首先,Lua将检查第一个操作数(即使它是有效的)。如果该操作数没有为
__add
定义元方法,那么Lua将检查第二个操作数。
不询问第一个(或第二个)操作数是否有方法__add
;它询问他们是否有 metamethod __add
。
从__add
示例中可以看出,您必须指定它尝试从哪个操作数获取元方法,以及以何种顺序。对于table[key]
,文字的重点是不会尝试从key
获取元方法,而只是来自table
。这可能看起来有点明显,但完整性比不完整性好。