программирование в lua, объектах

Пример кода:

function Account:new (o)
  o = o or {}   -- create object if user does not provide one
  setmetatable(o, self)
  self.__index = self
  return o
end

взятый от:

http://www.lua.org/pil/16.1.html

Что является целью:

self.__index = self

строка? И почему это выполняется каждый раз, когда объект создается?

6
задан anon 3 May 2010 в 22:47
поделиться

3 ответа

Как говорили другие, self (таблица Account ) является используется в качестве метатаблицы, присваиваемой объектам, созданным с помощью new . Слегка упрощая (дополнительная информация доступна по предоставленным ссылкам), когда поле не найдено в 'o', оно переходит в таблицу 'Account', потому что метатаблица o говорит перейти в Account (это то, что делает __ index ).

Однако нет необходимости выполнять его каждый раз при создании объекта. Вы можете так же легко прикрепить это где-нибудь:

Account.__index = Account

, и это тоже сработает.

Несколько более длинная история заключается в том, что если объект o имеет метатаблицу, а в этой метатаблице задано поле __ index , то поиск поля для поля на o будет использовать __ index для поиска поля ( __ index может быть таблицей или функцией). Если поле o задано, вы не переходите к функции его метатаблицы __ index для получения информации. Тем не менее, я снова рекомендую вам прочитать больше по ссылкам, указанным выше.

6
ответ дан 8 December 2019 в 18:33
поделиться

Lua не является объектно-ориентированным языком, но в нем есть все возможности для написания объектно-ориентированного кода. Однако это делается в виде прототипа типа JavaScript . Вместо явного создания классов создается объект-прототип, а затем клонируется для создания новых экземпляров.

Метаметод __ index вызывается для выполнения поиска ключей при доступе для чтения к таблице, когда ключ еще не присутствует в таблице. Итак, self .__ index = self по существу допускает наследование всех методов и полей «класса» Account новым «экземпляром», который создается в o = o или строки {} и setmetatable (o, self) .

См. Также:

3
ответ дан 8 December 2019 в 18:33
поделиться

Они используются для перенаправления доступа к таблицам ( local y = table [key]), которые также используются в вызовах методов. В приведенной выше строке объект o будет иметь любые попытки доступа к ключам, перенаправленные на текущий объект self, без особых усилий наследуя все функции-члены. И, возможно, переменные данных тоже, в зависимости от того, что это за __index и как он работает.

0
ответ дан 8 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: