Добавление методов в структуры
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 42 из 73.
Из главы об ООП в Lua ты знаешь, что таблицы могут содержать функции, как и любые другие значения. Формы также могут описывать эти поля-функции, превращая форму в небольшой контракт данных и поведения.
Поле-метод использует синтаксис типа function, который ты изучил в главе о функциях. Его первый параметр обычно называется 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: двоеточие. В следующем уроке синтаксис : будет связан с этими типизированными формами.
Задание
ЛегкоСоздай псевдоним типа с именем Rectangle, содержащий:
widthтипаnumberheightтипаnumberarea: метод(self: Rectangle) -> number, возвращающийwidth * heightperimeter: метод(self: Rectangle) -> number, возвращающий2 * (width + height)
Создай переменную rect типа Rectangle со значениями width 4, height 6 и реализацией обоих методов (не забудь параметр self).
Выведи каждое значение в отдельной строке (вызови методы с помощью точечного синтаксиса, передав rect как self):
- площадь прямоугольника
- периметр прямоугольника
- ширину прямоугольника
Попробуйте сами
-- Напишите код здесь
-- 1) определите тип Rectangle с двумя числовыми полями и двумя методами
-- 2) создайте rect (width 4, height 6), реализующий оба метода
-- 3) выведите area, perimeter и width
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари6Типизация структуры таблиц
Встроенные аннотации структурПсевдонимы типов для структурНеобязательные свойстваСтруктурированные и произвольные таблицыРасширение структурДобавление методов в структурыМетоды с Self и двоеточиемИтоги: Определение структуры таблицПотренируйтесь самостоятельно: Онлайн-компилятор Lua