Strings formatieren
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 16 von 70.
Wenn du ein Objekt direkt ausgibst, zeigt Lua etwas wenig Hilfreiches wie table: 0x55a... – nur eine Speicheradresse. Die Metamethode __tostring lässt dich genau definieren, welche Zeichenfolge dein Objekt repräsentiert, wenn es ausgegeben oder in Text umgewandelt wird.
Im Klassen-Pattern fügen Sie __tostring als Funktion in Ihrer Klassentabelle hinzu. Da die Klasse selbst als Metatabelle für Instanzen dient, findet und verwendet Lua diese Funktion automatisch:
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 .. ")"
endWenn Sie nun eine Player-Instanz ausgeben, ruft Lua automatisch Ihre __tostring-Methode auf:
local hero = Player:new("Luna", 5)
print(hero) -- Ausgabe: Player: Luna (Level 5)Beachten Sie, dass __tostring die Doppelpunkt-Syntax verwendet und self empfängt, was Ihnen Zugriff auf alle Instanzdaten gibt. Die Funktion muss einen String zurückgeben – Sie können ihn so formatieren, wie es für Ihr Objekt sinnvoll ist, indem Sie beliebige Attribute zu einer lesbaren Darstellung kombinieren.
Aufgabe
EinfachLass uns eine Book-Klasse erstellen, die weiß, wie sie sich selbst vorstellt! Wenn du ein Buch direkt ausgibst, zeigt Lua dank der Metamethode __tostring eine schön formatierte Zeichenfolge anstelle einer kryptischen Speicheradresse an.
Du wirst deinen Code auf zwei Dateien aufteilen:
Book.lua: Definiere deineBook-Klasse mit dem Standard-Prototyp-Muster. Jedes Buch sollte einentitleund einenauthorspeichern. Implementiere einen:new(title, author)-Konstruktor und die Metamethode__tostring, damit das Drucken eines Buches seine Informationen in einem lesbaren Format anzeigt.main.lua: Binde dein Book-Modul ein, erstelle Buch-Instanzen und gib sie direkt aus, um deine benutzerdefinierte String-Formatierung in Aktion zu sehen.
Deine __tostring-Methode sollte einen String in genau diesem Format zurückgeben:
"[title]" by [author]Beachte, dass der Titel innerhalb des Ausgabe-Strings in doppelte Anführungszeichen gesetzt ist.
Du erhältst vier Eingaben:
- Titel des ersten Buches
- Autor des ersten Buches
- Titel des zweiten Buches
- Autor des zweiten Buches
Erstelle in deiner Hauptdatei zwei Bücher mit den bereitgestellten Eingaben und gib jedes Buch direkt aus (nicht durch Aufrufen einer Methode – einfach print(book)). Jedes Buch sollte in einer eigenen Zeile erscheinen.
Wenn die Eingaben beispielsweise The Hobbit, J.R.R. Tolkien, 1984 und George Orwell sind, sollte die Ausgabe wie folgt aussehen:
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellDenke daran, dass __tostring einen String zurückgeben muss. Da deine Klassentabelle als Metatabelle für Instanzen dient, wird Lua deine __tostring-Funktion automatisch finden und verwenden, wenn du ein Buch ausgibst.
Spickzettel
Die Metamethode __tostring definiert, wie ein Objekt als String dargestellt wird, wenn es ausgegeben oder in Text umgewandelt wird.
Ohne __tostring zeigt das Ausgeben eines Objekts nur dessen Speicheradresse an:
print(someObject) -- Output: table: 0x55a...Fügen Sie __tostring als Methode in Ihrer Klasse hinzu, um die String-Repräsentation anzupassen:
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 .. ")"
endWenn Sie eine Instanz ausgeben, ruft Lua automatisch __tostring auf:
local hero = Player:new("Luna", 5)
print(hero) -- Output: Player: Luna (Level 5)Wichtige Punkte:
- Verwenden Sie die Doppelpunkt-Syntax (
:), damit die Methodeselferhält - Muss einen String zurückgeben
- Greifen Sie über
selfauf Instanzdaten zu - Da die Klassentabelle als Metatabelle dient, findet Lua
__tostringautomatisch
Probier es selbst
-- Das Book-Modul einbinden
local Book = require('Book')
-- Eingaben lesen
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: Zwei Buch-Instanzen mit Book:new() erstellen
-- TODO: Jedes Buch direkt ausgeben (einfach print(book) verwenden)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-Klasse2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-Check