Пример кода:
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
строка? И почему это выполняется каждый раз, когда объект создается?
Как говорили другие, self
(таблица Account
) является используется в качестве метатаблицы, присваиваемой объектам, созданным с помощью new
. Слегка упрощая (дополнительная информация доступна по предоставленным ссылкам), когда поле не найдено в 'o', оно переходит в таблицу 'Account', потому что метатаблица o говорит перейти в Account (это то, что делает __ index
).
Однако нет необходимости выполнять его каждый раз при создании объекта. Вы можете так же легко прикрепить это где-нибудь:
Account.__index = Account
, и это тоже сработает.
Несколько более длинная история заключается в том, что если объект o
имеет метатаблицу, а в этой метатаблице задано поле __ index
, то поиск поля для поля на o
будет использовать __ index
для поиска поля ( __ index
может быть таблицей или функцией). Если поле o
задано, вы не переходите к функции его метатаблицы __ index
для получения информации. Тем не менее, я снова рекомендую вам прочитать больше по ссылкам, указанным выше.
Lua не является объектно-ориентированным языком, но в нем есть все возможности для написания объектно-ориентированного кода. Однако это делается в виде прототипа типа JavaScript . Вместо явного создания классов создается объект-прототип, а затем клонируется для создания новых экземпляров.
Метаметод __ index
вызывается для выполнения поиска ключей при доступе для чтения к таблице, когда ключ еще не присутствует в таблице. Итак, self .__ index = self
по существу допускает наследование всех методов и полей «класса» Account
новым «экземпляром», который создается в o = o или строки {}
и setmetatable (o, self)
.
См. Также:
Они используются для перенаправления доступа к таблицам ( local y = table [key]), которые также используются в вызовах методов. В приведенной выше строке объект o будет иметь любые попытки доступа к ключам, перенаправленные на текущий объект self, без особых усилий наследуя все функции-члены. И, возможно, переменные данных тоже, в зависимости от того, что это за __index и как он работает.