Il metametodo __tostring
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 20 di 54.
Quando stampi una tabella in Lua, in genere vedi qualcosa di poco utile come table: 0x5f8a20, solo un indirizzo di memoria. Il metametodo __tostring ti permette di modificare questo comportamento definendo esattamente cosa deve essere visualizzato quando la tua tabella viene convertita in una stringa.
Questo metametodo è particolarmente utile per il debug e per creare un output più pulito. Quando Lua deve convertire la tua tabella in una stringa (ad esempio quando usi print()), controlla se la tabella ha un metatable con un campo __tostring. Se sì, Lua chiama quella funzione e usa il valore restituito al posto della rappresentazione predefinita.
Ecco come implementarlo:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- Risultato: Vector(3, 4)La funzione __tostring riceve la tabella come argomento e deve restituire una stringa. In questo esempio, costruisce una stringa formattata che mostra i valori x e y del vettore in un formato leggibile.
Questo rende il tuo codice molto più facile da gestire. Invece di vedere indirizzi di memoria criptici durante il debug, ottieni informazioni significative su ciò che contiene la tua tabella.
Sfida
FacileScrivi una funzione createPoint che accetta le coordinate x e y e restituisce una tabella punto con una rappresentazione testuale personalizzata.
Crea una tabella con i campi x e y, associa una metatabella con il metametodo __tostring e restituisci il risultato della conversione della tabella in una stringa usando tostring().
Logica:
- Crea una tabella con le chiavi
xeyimpostate sulle coordinate fornite - Crea una metatabella con
__tostringche restituisce una stringa nel formato"Point(x, y)" - Associa la metatabella alla tabella punto usando
setmetatable() - Restituisci
tostring(point)per ottenere la rappresentazione testuale personalizzata
Parametri:
x(numero): la coordinata x del puntoy(numero): la coordinata y del punto
Restituisce: La rappresentazione testuale personalizzata del punto nel formato "Point(x, y)" (stringa)
Provalo tu
function createPoint(x, y)
-- Scrivi il codice qui
end
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Iterazione avanzata delle tabelle
Iterare con pairs()Iterare con ipairs()pairs() vs. ipairs()Riepilogo - Scheda del personaggio4Introduzione alle metatabelle
Che cos’è una metatabella?setmetatable e getmetatableIl metametodo __indexIl metametodo __newindexIl metametodo __tostringMetametodi aritmetici - Parte 1Metametodi aritmetici - Parte 2Riepilogo - Tabella di sola lettura2Altre funzioni della libreria table
table.concat()Costruzione di tabelle e unpack()table.sort()Ordinamento personalizzato con funzioniRiepilogo - Tabellone dei punteggi più altiEsercitati da solo: Compilatore Lua online