Menu
CoddyTech

Self e metodi con i due punti

Fa parte della sezione Introduzione a Luau del percorso Lua di Coddy. Lezione 45 di 80.

Scrivere rect.area(rect) funziona, ma in Lua OOP hai imparato un modo migliore: i due punti. rect:area() è esattamente la stessa chiamata: Lua passa automaticamente come primo argomento la tabella che precede i due punti, self.

I due punti aiutano anche nella definizione. function account:deposit(amount) dichiara per te un primo parametro nascosto chiamato 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 è implicito
end

function account:getBalance(): number
    return self.balance
end

Nota che la struttura dichiara self esplicitamente, deposit: (self: Account, amount: number) -> (), anche se i due punti lo nascondono nell'implementazione. I due punti sono una scorciatoia sintattica; il parametro è comunque presente e il tipo lo esplicita. Un metodo che non restituisce nulla ha come tipo di ritorno il valore vuoto -> ().

La chiamata segue la stessa regola che già conosci: account:deposit(250) è identica a account.deposit(account, 250). Il comportamento in fase di esecuzione è lo stesso del capitolo su OOP: Luau aggiunge solo i tipi.

Nota che account stesso non ha annotazioni. Il tipo Account descrive la tabella completa, e la tabella corrisponde al tipo solo dopo aver aggiunto entrambi i metodi; local account: Account = {owner = "Maya", balance = 1500} farebbe sì che la modalità strict segnali i metodi mancanti.

challenge icon

Sfida

Facile

Associa due metodi a un account usando la sintassi con i due punti.

  1. Sotto la tabella, definisci function account:deposit(amount: number) che aggiunge amount a self.balance.
  2. Definisci function account:getBalance(): number che restituisce self.balance.
  3. Stampa account:getBalance(), chiama account:deposit(120), poi stampa di nuovo account:getBalance().

Premi Esegui il codice: l’output mostra 300, poi 420.

Provalo tu

type Account = {
    owner: string,
    balance: number,
    deposit: (self: Account, amount: number) -> (),
    getBalance: (self: Account) -> number,
}

local account = {owner = "Noah", balance = 300}

-- 1) function account:deposit(amount: number)
-- 2) function account:getBalance(): number
-- 3) stampa il saldo, deposita 120, poi stampalo di nuovo

Tutte le lezioni di Introduzione a Luau

Esercitati da solo: Compilatore Luau online