From the Lua 5.3 doc:
__index: The indexing accesstable[key]. ... The metamethod is looked up intable.
It says the same thing for __newindex, but not for any other metamethod.
If this were true (which it's not), it would be a major departure from previous versions of Lua. The following code outputs nil, as I would expect, but it's inconsistent with the doc.
#!/usr/bin/env lua5.3
local proto = {a = 54}
local t0 = {__index = proto}
print(t0.a)
To be clear: If the doc was correct, I would expect t0 in the above code to only require an __index field without an actual metatable for t0.a to be 54. So does anyone know what's going on with the doc?
You are incorrectly interpreting the meaning of the term. To say that it is "metamethod
Yis looked up in X" does not mean that it searches the X table for an entry namedY. It means that it gets the metatable for X and looks up an entry namedY, as if byrawget(getmetatable(X) or {}, "Y"), as specified in the docs.This terminology is repeatedly used in the metamethod descriptions. For example:
It's not asking if the first (or second) operand have a method
__add; it asks if they have a metamethod__add.As you can see from the
__addexample, you have to specify which of the operands it tries to get metamethods from, and in which order. Fortable[key], the point of the text is that doesn't try to get the metamethod fromkey, only fromtable. That may seem a tad bit obvious, but completeness is better than incompleteness.