Menu
Coddy logo textTech

Методы с 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 explicitlydeposit: (self: Account, amount: number) -> () — хотя colon скрывает его в реализации. colon — это синтаксический сахар; параметр всё равно присутствует, и type явно указывает его. Метод, который ничего не возвращает, типизируется с помощью пустого return -> ().

Вызов следует тому же правилу, которое вы уже знаете: account:deposit(250) идентичен account.deposit(account, 250). То же поведение во время выполнения (runtime), что и в главе про OOP — Luau просто добавляет types поверх.

challenge icon

Задание

Легко

Создайте псевдоним типа с именем Account, содержащий:

  • owner типа string
  • balance типа number
  • deposit(self: Account, amount: number) -> ()
  • getBalance(self: Account) -> number

Создайте таблицу account с owner "Maya" и balance 1500, затем прикрепите оба метода, используя синтаксис определения через двоеточие (function account:deposit(amount: number) …). deposit прибавляет amount к балансу; getBalance возвращает текущий баланс.

Используя вызовы через двоеточие:

  1. выведите balance
  2. пополните счет на 250 с помощью deposit
  3. выведите balance снова
  4. выведите owner

Попробуйте сами

-- Напишите код здесь
-- 1) определите тип Account (методы принимают self явно в типе)
-- 2) создайте таблицу account, затем прикрепите deposit/getBalance с синтаксисом двоеточия
-- 3) выведите balance, выполните deposit 250, выведите balance снова, выведите owner
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в Luau