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