1

来自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没有实际元表的字段 for t0.ato be 54。那么有谁知道doc是怎么回事?

4

1 回答 1

2

您错误地解释了该术语的含义。说它是“Y在 X 中查找元方法”并不意味着它在 X 表中搜索名为 的条目Y。这意味着它获取 X 的元表并查找名为 的条目Y,就像 byrawget(getmetatable(X) or {}, "Y")一样,如文档中指定的那样。

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

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

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

__add示例中可以看出,您必须指定它尝试从哪些操作数中获取元方法,以及以何种顺序。因为table[key],文本的重点是不尝试从 中获取元方法key,仅从table. 这似乎有点明显,但完整性比不完整性好。

于 2018-04-21T23:52:34.317 回答