Menu
Coddy logo textTech

Il costruttore :new()

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 8 di 70.

Creare oggetti manualmente, creare una tabella vuota, impostarne la metatabella e collegare __index diventa ripetitivo. La soluzione standard consiste nel definire direttamente nella classe un metodo costruttore :new() che si occupa di tutto questo per te.

Ecco lo schema:

local Dog = {}
Dog.__index = Dog

function Dog:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function Dog:bark()
    print("Woof!")
end

Analizziamo cosa succede all’interno di :new(). Per prima cosa, creiamo una tabella vuota chiamata instance. Poi impostiamo la sua metatabella su self, che è Dog quando chiamiamo Dog:new().

Poiché Dog.__index punta a Dog stesso, l’istanza può trovare tutti i metodi definiti in Dog. Infine, restituiamo il nuovo oggetto.

Nota la riga Dog.__index = Dog al di fuori del costruttore. È una scorciatoia comune: invece di creare una metatabella separata, la tabella della classe funge sia da prototipo sia da metatabella.

Ora la creazione di oggetti è semplice e coerente:

local myDog = Dog:new()
myDog:bark()  -- Output: Woof!

Ogni classe che crei seguirà questa stessa struttura. Il costruttore :new() diventa il punto unico in cui avviene la creazione degli oggetti, rendendo il tuo codice organizzato e prevedibile.

challenge icon

Sfida

Facile

Costruiamo una classe Cat usando il modello standard del costruttore che hai appena imparato. Organizzerai il codice in due file per esercitarti con la struttura corretta dei moduli.

Creerai:

  • Cat.lua: definisci la classe Cat con il modello completo del costruttore. La tua classe dovrebbe includere:
    • La tabella della classe con __index che punta a sé stessa
    • Un costruttore :new() che crea un'istanza, imposta la sua metatable e la restituisce
    • Un metodo :meow() che stampa il verso del gatto
    Restituisci la tabella della classe alla fine del file.
  • main.lua: richiedi il modulo Cat e usa il costruttore per creare un'istanza del gatto. Poi chiama il suo metodo per verificare che tutto sia collegato correttamente.

Riceverai un input: il numero di volte che il tuo gatto dovrebbe miagolare.

Il tuo metodo :meow() dovrebbe stampare esattamente:

Meow!

Nel file principale, crea un gatto usando Cat:new() e chiama :meow() il numero di volte specificato.

Per esempio, se l'input è 3, l'output dovrebbe essere:

Meow!
Meow!
Meow!

Provalo tu

-- Carica il modulo Cat
local Cat = require('Cat')

-- Leggi l'input: numero di volte in cui miagolare
local times = tonumber(io.read())

-- TODO: Crea un'istanza di Cat usando Cat:new()

-- TODO: Chiama il metodo :meow() il numero di volte specificato
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