Die __tostring-Metamethode
Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 20 von 54.
Wenn Sie eine Tabelle in Lua ausgeben, sehen Sie normalerweise etwas wenig Hilfreiches wie table: 0x5f8a20 – lediglich eine Speicheradresse. Die Metamethode __tostring ermöglicht es Ihnen, dieses Verhalten zu ändern, indem Sie genau definieren, was angezeigt werden soll, wenn Ihre Tabelle in einen String umgewandelt wird.
Diese Metamethode ist besonders nützlich für das Debugging und das Erstellen einer saubereren Ausgabe. Wenn Lua Ihre Tabelle in einen String umwandeln muss (wie bei der Verwendung von print()), prüft es, ob die Tabelle eine Metatabelle mit einem __tostring-Feld hat. Falls dies der Fall ist, ruft Lua diese Funktion auf und verwendet deren Rückgabewert anstelle der Standarddarstellung.
So implementieren Sie 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 __tostring-Funktion erhält die Tabelle als Argument und muss einen String zurückgeben. In diesem Beispiel erstellt sie einen formatierten String, der die x- und y-Werte des Vektors in einem lesbaren Format anzeigt.
Dies macht die Arbeit mit Ihrem Code wesentlich einfacher. Anstatt beim Debuggen kryptische Speicheradressen zu sehen, erhalten Sie aussagekräftige Informationen darüber, was Ihre Tabelle enthält.
Aufgabe
EinfachSchreiben Sie eine Funktion createPoint, die x- und y-Koordinaten entgegennimmt und eine Point-Tabelle mit einer benutzerdefinierten String-Repräsentation zurückgibt.
Erstellen Sie eine Tabelle mit den Feldern x und y, fügen Sie eine Metatabelle mit der Metamethode __tostring hinzu und geben Sie das Ergebnis der Konvertierung der Tabelle in einen String mittels tostring() zurück.
Logik:
- Erstellen Sie eine Tabelle, bei der die Schlüssel
xundyauf die angegebenen Koordinaten gesetzt sind - Erstellen Sie eine Metatabelle mit
__tostring, die einen String im Format"Point(x, y)"zurückgibt - Verknüpfen Sie die Metatabelle mit der Point-Tabelle unter Verwendung von
setmetatable() - Geben Sie
tostring(point)zurück, um die benutzerdefinierte String-Repräsentation zu erhalten
Parameter:
x(number): Die x-Koordinate des Punktesy(number): Die y-Koordinate des Punktes
Rückgabewert: Die benutzerdefinierte String-Repräsentation des Punktes im Format "Point(x, y)" (string)
Spickzettel
Die Metamethode __tostring ermöglicht es Ihnen, anzupassen, wie eine Tabelle dargestellt wird, wenn sie in einen String umgewandelt wird. Standardmäßig zeigt das Drucken einer Tabelle eine Speicheradresse wie table: 0x5f8a20 an.
Wenn Lua eine Tabelle in einen String umwandelt (wie zum Beispiel mit print()), prüft es, ob die Tabelle eine Metatabelle mit einem __tostring-Feld hat. Falls vorhanden, ruft Lua diese Funktion auf und verwendet deren Rückgabewert.
Die __tostring-Funktion erhält die Tabelle als Argument und muss einen String zurückgeben:
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)Sie können eine Tabelle auch explizit mit tostring() in einen String umwandeln, wodurch die Metamethode __tostring aufgerufen wird, falls sie definiert ist.
Probier es selbst
function createPoint(x, y)
-- Schreibe hier den Code
end
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittene Table-Iteration
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 2Zusammenfassung – Schreibgeschützte Tabellen7Fortgeschrittene String-Manipulation
string.gsub() für ErsetzungenEinführung in String-Patternsstring.find()string.match()Iterieren mit string.gmatch()Rückblick – Log-File-Parser2Weitere Funktionen der Table-Bibliothek
table.concat()Tabellenerstellung & unpack()table.sort()Benutzerdefiniertes Sortieren mit FunktionenRückblick – Highscore-Tabelle