Menu
CoddyTech

Добавление методов в структуры

Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 44 из 80.

Из главы о ООП в Lua ты знаешь, что таблицы могут содержать функции так же, как и любые другие значения. Фигуры тоже могут описывать эти поля-функции: превращая фигуру в небольшой контракт, описывающий данные и поведение.

Для поля-метода используется синтаксис типа функции, который ты изучил в главе о функциях. Его первый параметр по соглашению называется self — это таблица, которой принадлежит метод; фигура может даже ссылаться на саму себя:

type Greeter = {
    name: string,
    greet: (self: Greeter) -> string,
}

Чтобы реализовать фигуру, помести функцию в это поле и передай ей параметр self:

local greeter: Greeter = {
    name = "Ana",
    greet = function(self: Greeter): string
        return `Hello, I'm {self.name}`
    end,
}

Чтобы вызвать этот метод, нужно самостоятельно передать таблицу как self: greeter.greet(greeter). Через self метод читает поля той таблицы, для которой он был вызван.

Дважды записывать таблицу кажется неудобным, и ты уже знаешь решение Lua: двоеточие. В следующем уроке мы свяжем синтаксис : с этими типизированными фигурами.

challenge icon

Задание

Легко

Добавьте фигуре-прямоугольнику метод, который вычисляет её площадь.

  1. Напишите type Rectangle = {width: number, height: number, area: (self: Rectangle) -> number}.
  2. Создайте local rect: Rectangle с шириной 4, высотой 6 и area = function(self: Rectangle): number, возвращающей self.width * self.height.
  3. Выведите rect.area(rect), затем rect.width.

Нажмите Run Code: в выводе появятся 24 и 4.

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

-- 1) тип Rectangle с полями width, height и методом area
-- 2) локальная переменная rect: Rectangle (width 4, height 6) с реализованным методом area
-- 3) вывести площадь, затем ширину

Все уроки раздела Введение в Luau

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