Menu
Coddy logo textTech

Конструктор :new()

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 8 из 70.

Создание объектов вручную, создание пустой таблицы, установка её метатаблицы и связывание __index становятся рутинными. Стандартное решение — определить метод-конструктор :new() непосредственно в class, который выполнит всё это за вас.

Вот шаблон:

local Dog = {}
Dog.__index = Dog

function Dog:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function Dog:bark()
    print("Woof!")
end

Давайте разберём, что происходит внутри :new(). Сначала мы создаём пустую таблицу с именем instance. Затем устанавливаем для неё метатаблицу self, которой является Dog, когда мы вызываем Dog:new().

Поскольку Dog.__index указывает на сам Dog, instance может найти все методы, определённые в Dog. Наконец, мы возвращаем новый объект.

Обратите внимание на строку Dog.__index = Dog вне конструктора. Это распространённое сокращение: вместо создания отдельной метатаблицы таблица класса используется и как прототип, и как метатаблица.

Теперь создание объектов выполняется чисто и единообразно:

local myDog = Dog:new()
myDog:bark()  -- Вывод: Woof!

Каждый class, который вы создаёте, будет следовать этой же структуре. Конструктор :new() становится единственным местом, где происходит создание объектов, благодаря чему ваш код остаётся организованным и предсказуемым.

challenge icon

Задание

Легко

Давайте создадим class Cat, используя стандартный шаблон конструктора, который вы только что изучили. Вы распределите код по двум файлам, чтобы попрактиковаться в правильной структуре module.

Вы создадите:

  • Cat.lua: Define ваш Cat class с полным шаблоном конструктора. Ваш class должен включать:
    • таблицу class с __index, указывающим на неё саму
    • конструктор :new(), который создаёт instance, устанавливает его metatable и возвращает его
    • method :meow(), который выводит звук cat
    Return таблицу class в конце файла.
  • main.lua: Require ваш модуль Cat и используйте конструктор, чтобы создать instance cat. Затем вызовите его method, чтобы проверить, что всё правильно связано.

Вы получите один input: number раз, которое ваш cat should мяукнуть.

Ваш method :meow() должен выводить exactly:

Meow!

В вашем основном файле создайте cat с помощью Cat:new() и вызовите :meow() указанное количество times.

Например, если input равен 3, Output должен быть таким:

Meow!
Meow!
Meow!

Попробуйте сами

-- Подключить модуль Cat
local Cat = require('Cat')

-- Прочитать ввод: количество раз мяуканья
local times = tonumber(io.read())

-- TODO: Создать экземпляр кота с помощью Cat:new()

-- TODO: Вызвать метод :meow() указанное количество раз
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua