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 .. ")"
endOra, 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.
Sfida
FacileCreiamo 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 classeBookusando il modello standard basato su prototipi. Ogni libro deve contenere untitlee unauthor. Includi un costruttore:new(title, author)e implementa il metametodo__tostringin 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:
- Titolo del primo libro
- Autore del primo libro
- Titolo del secondo libro
- 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 OrwellRicorda 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))
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