Почему доктор говорит, что в таблице ищется `__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, Это может показаться немного очевидным, но полнота лучше, чем незавершенность.

Другие вопросы по тегам