Die __tostring-Metamethode
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 20 von 54.
Wenn du eine Tabelle in Lua ausgibst, siehst du normalerweise etwas wenig Hilfreiches wie table: 0x5f8a20, lediglich eine Speicheradresse. Mit der Metamethode __tostring kannst du dieses Verhalten ändern, indem du genau festlegst, was angezeigt werden soll, wenn deine Tabelle in eine Zeichenkette umgewandelt wird.
Diese Metamethode ist besonders nützlich zum Debuggen und zum Erstellen einer übersichtlicheren Ausgabe. Wenn Lua deine Tabelle in eine Zeichenkette umwandeln muss (beispielsweise bei der Verwendung von print()), prüft es, ob die Tabelle eine Metatabelle mit einem Feld __tostring besitzt. Falls dies der Fall ist, ruft Lua diese Funktion auf und verwendet ihren Rückgabewert anstelle der standardmäßigen Darstellung.
So implementierst du es:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- Ausgabe: Vector(3, 4)Die Funktion __tostring erhält die Tabelle als Argument und muss eine Zeichenkette zurückgeben. In diesem Beispiel erstellt sie eine formatierte Zeichenkette, die die x- und y-Werte des Vektors in einem lesbaren Format anzeigt.
Dadurch lässt sich dein Code viel einfacher bearbeiten. Anstatt beim Debuggen kryptische Speicheradressen zu sehen, erhältst du aussagekräftige Informationen darüber, was deine Tabelle enthält.
Aufgabe
EinfachSchreibe eine Funktion createPoint, die die Koordinaten x und y entgegennimmt und eine Punkttabelle mit einer benutzerdefinierten Zeichenfolgendarstellung zurückgibt.
Erstelle eine Tabelle mit den Feldern x und y, füge eine Metatabelle mit der Metamethode __tostring hinzu und gib das Ergebnis der Umwandlung der Tabelle in eine Zeichenfolge mit tostring() zurück.
Logik:
- Erstelle eine Tabelle mit den Schlüsseln
xundy, die auf die bereitgestellten Koordinaten gesetzt werden - Erstelle eine Metatabelle mit
__tostring, die eine Zeichenfolge im Format"Point(x, y)"zurückgibt - Füge die Metatabelle mithilfe von
setmetatable()an die Punkttabelle an - Gib
tostring(point)zurück, um die benutzerdefinierte Zeichenfolgendarstellung zu erhalten
Parameter:
x(number): Die x-Koordinate des Punktsy(number): Die y-Koordinate des Punkts
Rückgabewert: Die benutzerdefinierte Zeichenfolgendarstellung des Punkts im Format "Point(x, y)" (string)
Probier es selbst
function createPoint(x, y)
-- Schreibe hier Code
end
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmablauf
1Fortgeschrittene Tabelleniteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen4Einführung in Metatables
Was ist eine Metatable?setmetatable & getmetatableDie __index-MetamethodeDie __newindex-MetamethodeDie __tostring-MetamethodeArithmetische Metamethoden Teil 1Arithmetische Metamethoden Teil 2Rückblick – Read-Only-Tabelle2Weitere Funktionen der Tabellenbibliothek
table.concat()Tabellenkonstruktion & unpack()table.sort()Eigene Sortierung mit FunktionenRückblick – Highscore-TabelleÜbe selbstständig: Online-Lua-Compiler