«self» esplicito
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 2 di 70.
Quando una funzione si trova all'interno di una tabella, spesso deve accedere ai dati di quella stessa tabella o modificarli. Ma ecco il problema: come fa la funzione a sapere a quale tabella appartiene?
La soluzione consiste nel passare esplicitamente la tabella come primo argomento alla funzione. Per convenzione, questo parametro si chiama self:
local counter = {
value = 0
}
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
print(counter.value) -- Output: 1Nota come chiamiamo counter.increment(counter), passando la tabella stessa come argomento. All'interno della funzione, self ora si riferisce a quella tabella, consentendoci di leggere e modificare self.value.
Questo schema è essenziale perché permette alla funzione di lavorare con i dati della tabella senza codificarne rigidamente il nome. Considera una funzione che azzera e restituisce il conteggio attuale:
function counter.reset(self)
local old = self.value
self.value = 0
return old
end
print(counter.reset(counter)) -- Risultato: 1
print(counter.value) -- Risultato: 0Anche se passare la tabella manualmente funziona, può risultare ripetitivo. Nella prossima lezione imparerai una sintassi più pulita che gestisce tutto questo automaticamente.
Sfida
FacileCrea una tabella chiamata tracker con un campo count inizializzato a 0.
Aggiungi una funzione tracker.addAmount(self, amount) che:
- Accetta
self(la tabella) come primo parametro - Accetta
amountcome secondo parametro - Aggiunge
amountaself.count
Riceverai due input:
- Primo importo da aggiungere
- Secondo importo da aggiungere
Chiama tracker.addAmount due volte (una per ciascun input), passando ogni volta la tabella come primo argomento. Dopo entrambe le chiamate, stampa il valore finale di tracker.count.
Provalo tu
-- Leggi l'input
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())
-- TODO: Scrivi il tuo codice qui sotto
-- Crea una tabella chiamata 'tracker' con un campo 'count' inizializzato a 0
-- Aggiungi una funzione tracker.addAmount(self, amount) che sommi amount a self.count
-- Chiama tracker.addAmount due volte, passando la tabella come primo argomento
-- Stampa il valore finale di count
print(tracker.count)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