Punto o due punti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 4 di 70.
Ora che conosci sia la sintassi con il punto sia quella con i due punti, è fondamentale capire quando usare ciascuna e cosa succede se le mescoli in modo errato.
La regola fondamentale è semplice: il modo in cui definisci una funzione deve corrispondere al modo in cui la chiami. Se la definisci con i due punti, chiamala con i due punti. Se la definisci con un punto e self esplicito, chiamala con un punto e passa la tabella.
Ecco cosa succede quando non li abbini correttamente:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- WRONG: calling with dot, but no table passed
game.addPoints(10) -- Error! self is now 10, not the tableQuando chiami game.addPoints(10), Lua non passa automaticamente game. Il valore 10 diventa self, causando un comportamento imprevisto o errori.
La direzione inversa è più permissiva:
function game.reset(self)
self.score = 0
end
-- Chiamare con i due punti: game:reset() equivale a game.reset(game)
game:reset() -- self riceve correttamente game, quindi funzionaAnche se questo caso specifico potrebbe funzionare, crea confusione e può interrompere le funzioni che si aspettano argomenti specifici. L’approccio più sicuro è mantenere la coerenza: usa i due punti sia per la definizione sia per la chiamata quando la funzione richiede self, e usa il punto quando non ne ha bisogno.
Sfida
FacileCrea una tabella chiamata player con un campo score inizializzato a 0.
Aggiungi due funzioni alla tabella:
player.setScore(self, value)- definita con la sintassi con il punto e il parametroselfesplicito. Impostaself.scoreal valore indicato.player:addBonus(amount)- definita con la sintassi con i due punti. Aggiungeamountaself.score.
Riceverai due input:
- Un valore iniziale per il punteggio
- Una quantità bonus da aggiungere
Esegui i seguenti passaggi:
- Chiama
setScoreusando la sintassi con il punto (passando la tabella come primo argomento) per impostare il punteggio iniziale - Chiama
addBonususando la sintassi con i due punti per aggiungere il bonus - Stampa il valore finale di
player.score
Ricorda: il modo in cui chiami ciascuna funzione deve corrispondere al modo in cui è stata definita.
Provalo tu
-- Leggi l'input
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: Scrivi il tuo codice qui sotto
-- 1. Crea una tabella chiamata 'player' con un campo 'score' inizializzato a 0
-- 2. Aggiungi player.setScore(self, value) usando la sintassi con il punto e self esplicito
-- 3. Aggiungi player:addBonus(amount) usando la sintassi con i due punti
-- 4. Chiama setScore usando la sintassi con il punto (passando la tabella come primo argomento)
-- 5. Chiama addBonus usando la sintassi con i due punti
-- Mostra il punteggio finale
print(player.score)Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Il concetto di «self»
Tabelle con funzioni«self» esplicitoLa sintassi dei due puntiPunto o due puntiRiepilogo - Spostare il punto4Progetto: Banca digitale
Configurazione del progettoMetodo di deposito2Schema del prototipo di classe
Il concetto di prototipoCollegare con __indexIl costruttore :new()Inizializzare gli attributiIstanze indipendentiRiepilogo - Fabbrica di auto5Sovraccarico degli operatori nella OOP
Sommare oggettiSottrarre oggettiConcatenare oggettiConfrontare oggetti (<, >)Ripasso - Calcoli con il portafoglio8Incapsulamento
Convenzioni di denominazioneClosure per la privacyAccesso tramite closureTabelle di sola letturaLogica di convalidaRiepilogo - Cassaforte sicura11Modelli di progettazione (base)
Funzioni factoryTabella singletonPattern IteratorObserver (listener)Riepilogo - Factory per logger3Stato e comportamento degli oggetti
Variabili di istanzaMetodi getterMetodi setterProprietà calcolateFormattazione delle stringheControlli di uguaglianzaRiepilogo - Voto dello studente6Fondamenti dell'ereditarietà
Configurare l'ereditarietàEreditare i metodiEstendere il costruttoreAggiungere metodi alla classe figliaCondiviso vs specificoRiepilogo - Gerarchia delle formeEsercitati da solo: Compilatore Lua online