Методы с Self и двоеточием
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 43 из 73.
Запись rect.area(rect) работает, но ещё в разделе Lua OOP ты изучил лучший способ: colon. Вызов rect:area() полностью эквивалентен: Lua автоматически передаёт таблицу перед colon в качестве первого аргумента — self.
colon также помогает в месте определения. 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 — explicitly, deposit: (self: Account, amount: number) -> (), хотя colon скрывает его в реализации. colon — это синтаксический сахар; параметр всё равно существует, и тип явно его указывает. Метод, который ничего не возвращает, имеет тип с пустым возвращаемым значением -> ().
Вызов следует тому же правилу, которое ты уже знаешь: account:deposit(250) идентичен account.deposit(account, 250). Поведение во время выполнения такое же, как в главе об OOP: Luau просто добавляет типы.
Задание
ЛегкоСоздайте псевдоним типа с именем Account, содержащий:
ownerтипаstringbalanceтипаnumberdeposit:(self: Account, amount: number) -> ()getBalance:(self: Account) -> number
Создайте таблицу account с owner "Maya" и balance 1500, затем присоедините оба метода, используя синтаксис определения с двоеточием (function account:deposit(amount: number) …). deposit добавляет amount к balance; getBalance возвращает текущее значение balance.
Используя вызовы с двоеточием:
- выведите balance
- выполните deposit
250 - снова выведите balance
- выведите owner
Попробуйте сами
-- Напишите код здесь
-- 1) определите тип Account (методы принимают self явно в типе)
-- 2) создайте таблицу account, затем прикрепите deposit/getBalance с синтаксисом двоеточия
-- 3) выведите balance, deposit 250, выведите balance снова, выведите owner
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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