为什么医生会在表格中查找“__index”?

时间:2018-04-21 23:35:02

标签: lua lua-5.3

来自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 }}。那么有谁知道文档会发生什么?

1 个答案:

答案 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。这可能看起来有点明显,但完整性比不完整性好。