Menu
Coddy logo textTech

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 table

Quando 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 funziona

Anche 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.

challenge icon

Sfida

Facile

Crea una tabella chiamata player con un campo score inizializzato a 0.

Aggiungi due funzioni alla tabella:

  1. player.setScore(self, value) - definita con la sintassi con il punto e il parametro self esplicito. Imposta self.score al valore indicato.
  2. player:addBonus(amount) - definita con la sintassi con i due punti. Aggiunge amount a self.score.

Riceverai due input:

  1. Un valore iniziale per il punteggio
  2. Una quantità bonus da aggiungere

Esegui i seguenti passaggi:

  1. Chiama setScore usando la sintassi con il punto (passando la tabella come primo argomento) per impostare il punteggio iniziale
  2. Chiama addBonus usando la sintassi con i due punti per aggiungere il bonus
  3. 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)
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Lua online