Menu
CoddyTech

Методы с 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} в строгом режиме привела бы к сообщению об отсутствующих методах.

challenge icon

Задание

Легко

Добавь к аккаунту два метода с помощью синтаксиса с двоеточием.

  1. Под таблицей определи function account:deposit(amount: number), которая добавляет amount к self.balance.
  2. Определи function account:getBalance(): number, которая возвращает self.balance.
  3. Выведи 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

Потренируйтесь самостоятельно: Онлайн-компилятор Luau