Menu
Coddy logo textTech

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

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

Из главы об ООП в 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

Задание

Легко

Создайте псевдоним типа с именем Rectangle со следующими полями:

  • width типа number
  • height типа number
  • area — метод (self: Rectangle) -> number, возвращающий width * height
  • perimeter — метод (self: Rectangle) -> number, возвращающий 2 * (width + height)

Создайте переменную rect типа Rectangle с шириной 4, высотой 6 и реализацией обоих методов (не забудьте про параметр self).

Выведите на экран, каждый с новой строки (вызывайте методы через точечный синтаксис, передавая rect в качестве self):

  1. площадь прямоугольника
  2. периметр прямоугольника
  3. ширину прямоугольника

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

-- Напишите код здесь
-- 1) определите тип Rectangle с двумя числовыми полями и двумя методами
-- 2) создайте rect (width 4, height 6), реализующий оба метода
-- 3) выведите area, perimeter и width
quiz iconПроверьте себя

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

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