Добавление методов в структуры
Часть раздела Введение в 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: двоеточие. В следующем уроке синтаксис : связывается с этими типизированными шейпами.
Задание
ЛегкоСоздайте псевдоним типа с именем Rectangle со следующими полями:
widthтипаnumberheightтипаnumberarea— метод(self: Rectangle) -> number, возвращающийwidth * heightperimeter— метод(self: Rectangle) -> number, возвращающий2 * (width + height)
Создайте переменную rect типа Rectangle с шириной 4, высотой 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 и двоеточиемИтоги: Определение структуры таблиц