Методы с Self и двоеточием
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 45 из 80.
Запись rect.area(rect) работает, но ещё в разделе Lua OOP ты узнал более удобный способ: двоеточие. Вызов rect:area() выполняет то же самое: Lua автоматически передаёт таблицу перед двоеточием первым аргументом — self.
Двоеточие помогает и при определении метода. Запись function account:deposit(amount) объявляет за тебя скрытый первый параметр с именем self:
type Account = {
owner: string,
balance: number,
deposit: (self: Account, amount: number) -> (),
getBalance: (self: Account) -> number,
}
local account = {owner = "Maya", balance = 1500}
function account:deposit(amount: number)
self.balance += amount -- self подразумевается неявно
end
function account:getBalance(): number
return self.balance
endОбрати внимание: в описании типа self указан явно — deposit: (self: Account, amount: number) -> (), хотя в реализации двоеточие скрывает его. Двоеточие — это синтаксический сахар; параметр всё равно существует, и тип явно его указывает. Метод, который ничего не возвращает, обозначается пустым типом возвращаемого значения -> ().
Вызов подчиняется уже знакомому тебе правилу: account:deposit(250) — то же самое, что account.deposit(account, 250). Поведение во время выполнения такое же, как в главе об ООП: Luau лишь добавляет типы.
Обрати внимание, что для самой account аннотация типа не указана. Тип Account описывает готовую таблицу, и таблица соответствует ему только после добавления обоих методов; запись local account: Account = {owner = "Maya", balance = 1500} в строгом режиме привела бы к сообщению об отсутствующих методах.
Задание
ЛегкоДобавь к аккаунту два метода с помощью синтаксиса с двоеточием.
- Под таблицей определи
function account:deposit(amount: number), которая добавляетamountкself.balance. - Определи
function account:getBalance(): number, которая возвращаетself.balance. - Выведи
account:getBalance(), вызовиaccount:deposit(120), затем снова выведиaccount:getBalance().
Нажми Выполнить код: вывод показывает 300, затем 420.
Попробуйте сами
type Account = {
owner: string,
balance: number,
deposit: (self: Account, amount: number) -> (),
getBalance: (self: Account) -> number,
}
local account = {owner = "Noah", balance = 300}
-- 1) функция account:deposit(amount: number)
-- 2) функция account:getBalance(): number
-- 3) выведите баланс, внесите 120, затем снова выведите баланс
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции без возвращаемого значенияНеобязательные параметрыЗначения параметров по умолчаниюЗначения по умолчанию для булевых параметровФункции с переменным числом аргументовОпределение типов функцийПовторение: типизированные функции2Основные типы
Число, строка и булево значениеТип 'any': запасной выходТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовПовторение: практика с основными типами5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: массивы и отображения
Типизированные массивыДобавление и чтение элементовЧто такое тип отображения?Объявление и доступ к отображениямПеребор таблицТаблицы смешанной структурыЧтение сеткиСоздание сеткиtable.unpackПовторение: массивы и отображения6Типизация структуры таблиц
Встроенные аннотации структурПсевдонимы типов для структурНеобязательные свойстваСтруктурированные и произвольные таблицыРасширение структурДобавление методов в структурыМетоды с Self и двоеточиемИтоги: Определение структуры таблицПотренируйтесь самостоятельно: Онлайн-компилятор Luau