Почему вы можете установить __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
, так далее.