Menu
CoddyTech

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, ecco come sono correlate e cosa va storto quando la tabella non viene passata.

Entrambi i due punti sono una forma abbreviata. Definire function game:addPoints(points) equivale a definire function game.addPoints(self, points), e chiamare game:addPoints(10) equivale a chiamare game.addPoints(game, 10). Un metodo funziona purché la tabella arrivi come primo argomento.

Ecco cosa succede quando la tabella non viene passata:

local game = { score = 0 }

function game:addPoints(points)
    self.score = self.score + points
end

-- SBAGLIATO: chiamata con il punto, ma senza passare la tabella
game.addPoints(10)  -- Errore! self ora è 10, non la tabella

Quando chiami game.addPoints(10), Lua non passa automaticamente game. Il valore 10 diventa self e self.score non funziona perché 10 è un numero, non una tabella.

Una funzione definita con un punto e un self esplicito funziona con una chiamata con i due punti, perché i due punti passano la tabella come primo argomento:

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

Entrambe le definizioni creano la stessa funzione, quindi la scelta è una convenzione: usa i due punti per definire e chiamare le funzioni che operano su self e il punto per le funzioni che non usano self. Così, ogni chiamata mostra se la tabella viene passata.

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 specificato.
  2. player:addBonus(amount) - definita con la sintassi con i due punti. Aggiunge amount a self.score.

Riceverai due input:

  1. Un valore iniziale del 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


-- Visualizza 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