Почему вы можете установить __index равным таблице

Метаметод индекса может быть установлен равным таблицам. Из того, что я могу сказать

foo.__index = function(self, k)
    return bar[k]
end

а также

foo.__index = bar

подобные. Почему объявление функций таким образом разрешено в этой ситуации?

1 ответ

Решение

Это не объявление функции - назначение таблицы __index просто ярлык для использования функции, которую вы описали.

Из программирования на Lua (для Lua 5.0, но эта часть языка не изменилась):

Использование метаметода __index для наследования настолько распространено, что Lua предоставляет ярлык. Несмотря на название, метаметод __index не обязательно должен быть функцией: вместо этого он может быть таблицей. Когда это функция, Lua вызывает ее с таблицей и отсутствующим ключом в качестве аргументов. Когда это таблица, Lua восстанавливает доступ в этой таблице.

Это не похоже на то, что таблица, которую вы назначаете волшебным образом, становится функцией. type(foo.__index) все еще вернется tableи вы все равно можете делать с ним то же, что и с другими таблицами, например, pairs а также next, так далее.

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