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
endNota 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.
Sfida
FacileAssocia due metodi a un account usando la sintassi con i due punti.
- Sotto la tabella, definisci
function account:deposit(amount: number)che aggiungeamountaself.balance. - Definisci
function account:getBalance(): numberche restituisceself.balance. - Stampa
account:getBalance(), chiamaaccount:deposit(120), poi stampa di nuovoaccount: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
1Per iniziare con Luau
Che cos'è Luau?Perché usare Luau?Il tuo primo codice LuauVerifica dei tipi e modalità di erroreRiepilogo: introduzione a Luau4Lavorare con le funzioni
Tipizzare parametri e valori restituitiTipizzare le funzioni anonimeFunzioni che non restituiscono nullaParametri opzionaliValori predefiniti dei parametriValori predefiniti per i booleaniFunzioni variadicheDefinire i tipi di funzioneRiepilogo: funzioni tipizzate7Progetto: Gestore di attività tipizzato
Progetto: La struttura di un'attivitàFunzione per aggiungere un'attività2Tipi fondamentali
Numero, stringa e booleanoIl tipo 'any': una via di fugaIl tipo 'unknown'Tipi nil e opzionaliL’inferenza dei tipi in praticaAnnotazioni esplicite dei tipiRipasso: esercizi sui tipi fondamentali5Alias, unioni e intersezioni
Alias di tipo per i primitiviTipi unioneLavorare con i tipi unioneTipi letteraliTipi intersezioneCombinare gli alias di tipoRiepilogo: combinazioni avanzate di tipi3Tabelle tipizzate: array e mappe
Array tipizzatiAggiungere e leggere elementiChe cos'è un tipo map?Dichiarare e accedere alle mappeIterare sulle tabelleTabelle con forme misteLeggere una grigliaCreare una grigliatable.unpackRiepilogo: array e mappe6Tipizzare le forme delle tabelle
Annotazioni inline delle formeAlias di tipo per le formeProprietà opzionaliForme e tabelle libere a confrontoEstendere le formeAggiungere metodi alle formeSelf e metodi con i due puntiRiepilogo: definire le forme delle tabelleEsercitati da solo: Compilatore Luau online