Почему доктор говорит, что в таблице ищется `__index`?
Из документа 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
поле без фактической метатаблицы для t0.a
быть 54
, Так кто-нибудь знает, что происходит с документом?
1 ответ
Вы неправильно интерпретируете значение этого термина. Сказать, что это "метаметод" Y
поиск в X"не означает, что он ищет в таблице X запись с именем Y
, Это означает, что он получает метатаблицу для X и ищет запись с именем Y
как бы rawget(getmetatable(X) or {}, "Y")
, как указано в документах.
Эта терминология неоднократно используется в описаниях метаметодов. Например:
Сначала Lua проверит первый операнд (даже если он действителен). Если этот операнд не определяет метаметод для
__add
тогда Луа проверит второй операнд.
Это не спрашивает, есть ли у первого (или второго) операнда метод __add
; он спрашивает, есть ли у них метаметод __add
,
Как вы можете видеть из __add
Например, вы должны указать, от какого из операндов он пытается получить метаметоды, и в каком порядке. За table[key]
смысл текста в том, что не пытается получить метаметод от key
только из table
, Это может показаться немного очевидным, но полнота лучше, чем незавершенность.