Создание объектов (которые просто являются таблицами) совершенно отличается от Lua.
Основная идея заключается в создании обычной таблицы, содержащей атрибуты (функции и значения), которые являются общими для всех экземпляров. В этой таблице я назову CAT для таблицы общих атрибутов.
Если вы ссылаетесь на атрибут в таблице и Lua не может найти этот атрибут, есть способ сообщить Lua, где еще искать атрибут. Мы хотим, чтобы Луа посмотрел в КПП общие атрибуты. Метатаблицы отвечают, что нужно. Подробнее о том, как это работает позже.
Нам также нужны методы в CAT, чтобы иметь возможность использовать значения экземпляров. Self ответы, которые нужны. Когда вы вызываете табличную функцию (метод) следующим образом: tableName:methodName()
, Lua автоматически помещает ссылку на объект таблицы в качестве первого параметра. Имя этого параметра - self. Даже если метод находится в CAT, self будет ссылаться на конкретную таблицу экземпляров вызывающего объекта.
Скажем, у нас есть кошка под названием Автомобиль.
metaCar = { __index = Car }
-- this table will be used as the metatable for all instances of Car
-- Lua will look in Car for attributes it can't find in the instance
Например:
-- instance table is called mustang
-- setmetatable(mustang, metaCar)
Вот функция общего назначения, которая создает новые объекты экземпляров и устанавливает метатаблицу для нее. Если CAT имеет функцию конструктора (init), она также выполняется.
function newObj(metatable)
..obj = {} -- create new empty instance object
..setmetatable(obj, metatable) –- connect the metatable to it
..if obj.init then -- if the CAT has an init method, execute it
....obj:init()
..end
..return obj
end