Menu
Coddy logo textTech

Formattazione delle stringhe

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

Quando stampi direttamente un oggetto, Lua mostra qualcosa di poco utile come table: 0x55a.... Solo un indirizzo di memoria. Il metametodo __tostring ti permette di definire esattamente quale stringa rappresenta il tuo oggetto quando viene stampato o convertito in testo.

Nel modello della classe, aggiungi __tostring come funzione nella tabella della tua classe. Poiché la classe stessa funge da metatabella per le istanze, Lua trova e usa automaticamente questa funzione:

local Player = {}
Player.__index = Player

function Player:new(name, level)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.level = level
    return instance
end

function Player:__tostring()
    return "Player: " .. self.name .. " (Level " .. self.level .. ")"
end

Ora, quando stampi un'istanza di Player, Lua chiama automaticamente il tuo metodo __tostring:

local hero = Player:new("Luna", 5)
print(hero)  -- Output: Player: Luna (Level 5)

Nota che __tostring usa la sintassi con i due punti e riceve self, consentendoti di accedere a tutti i dati dell'istanza. La funzione deve restituire una stringa. Puoi formattarla nel modo più adatto al tuo oggetto, combinando gli attributi in una rappresentazione leggibile.

challenge icon

Sfida

Facile

Creiamo una classe Book che sappia presentarsi! Quando stampi direttamente un libro, Lua visualizzerà una stringa formattata in modo chiaro invece di un criptico indirizzo di memoria: tutto grazie al metametodo __tostring.

Organizzerai il codice in due file:

  • Book.lua: Definisci la classe Book usando il modello standard basato su prototipi. Ogni libro deve contenere un title e un author. Includi un costruttore :new(title, author) e implementa il metametodo __tostring in modo che, stampando un libro, le sue informazioni vengano visualizzate in un formato leggibile.
  • main.lua: Carica il modulo Book, crea istanze di libri e stampale direttamente per vedere in azione la tua formattazione personalizzata delle stringhe.

Il tuo metodo __tostring deve restituire una stringa nel formato esatto seguente:

"[title]" by [author]

Nota che il titolo è racchiuso tra virgolette doppie nella stringa di output.

Riceverai quattro input:

  1. Titolo del primo libro
  2. Autore del primo libro
  3. Titolo del secondo libro
  4. Autore del secondo libro

Nel file principale, crea due libri usando gli input forniti e stampa direttamente ciascun libro (senza chiamare un metodo, usa semplicemente print(book)). Ogni libro deve comparire su una riga separata.

Per esempio, se gli input sono The Hobbit, J.R.R. Tolkien, 1984 e George Orwell, l'output dovrebbe essere:

"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwell

Ricorda che __tostring deve restituire una stringa e, poiché la tabella della tua classe funge da metatabella per le istanze, Lua troverà e utilizzerà automaticamente la tua funzione __tostring quando stampi un libro.

Provalo tu

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

-- Leggi gli input
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()

-- TODO: Crea due istanze di libri usando Book:new()


-- TODO: Stampa direttamente ogni libro (usa semplicemente print(book))

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