Strings formatieren
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 16 von 70.
Wenn du ein Objekt direkt ausgibst, zeigt Lua etwas wenig Hilfreiches wie table: 0x55a... an. Nur eine Speicheradresse. Mit der Metamethode __tostring kannst du genau festlegen, welche Zeichenfolge dein Objekt repräsentiert, wenn es ausgegeben oder in Text umgewandelt wird.
Im Klassenmuster fügst du __tostring als Funktion in deine Klassentabelle ein. 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 du nun eine Player-Instanz ausgibst, ruft Lua deine __tostring-Methode automatisch auf:
local hero = Player:new("Luna", 5)
print(hero) -- Ausgabe: Player: Luna (Level 5)Beachte, dass __tostring die Doppelpunkt-Syntax verwendet und self erhält, wodurch du Zugriff auf alle Instanzdaten hast. Die Funktion muss eine Zeichenkette zurückgeben. Du kannst sie so formatieren, wie es für dein Objekt sinnvoll ist, und 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 eine übersichtlich formatierte Zeichenkette anstelle einer kryptischen Speicheradresse an – alles dank der __tostring-Metamethode.
Du organisierst deinen Code auf zwei Dateien verteilt:
Book.lua: Definiere deineBook-Klasse nach dem Standard-Prototypmuster. Jedes Buch sollte einentitleund einenauthorspeichern. Füge einen:new(title, author)-Konstruktor hinzu und implementiere die__tostring-Metamethode, sodass bei der Ausgabe eines Buchs seine Informationen in einem lesbaren Format angezeigt werden.main.lua: Binde dein Book-Modul ein, erstelle Buchinstanzen und gib sie direkt aus, um deine benutzerdefinierte Zeichenkettenformatierung in Aktion zu sehen.
Deine __tostring-Methode sollte eine Zeichenkette in genau diesem Format zurückgeben:
"[title]" by [author]Beachte, dass der Titel innerhalb der Ausgabezeichenkette in doppelte Anführungszeichen eingeschlossen ist.
Du erhältst vier Eingaben:
- Titel des ersten Buchs
- Autor des ersten Buchs
- Titel des zweiten Buchs
- Autor des zweiten Buchs
Erstelle in deiner Hauptdatei zwei Bücher mithilfe der bereitgestellten Eingaben und gib jedes Buch direkt aus (nicht durch den Aufruf einer Methode, sondern einfach mit print(book)). Jedes Buch sollte in einer eigenen Zeile erscheinen.
Wenn die Eingaben beispielsweise The Hobbit, J.R.R. Tolkien, 1984 und George Orwell lauten, sollte die Ausgabe folgendermaßen aussehen:
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellDenke daran, dass __tostring eine Zeichenkette zurückgeben muss. Da deine Klassentabelle als Metatabelle für Instanzen dient, findet und verwendet Lua deine __tostring-Funktion automatisch, wenn du ein Buch ausgibst.
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: Erstelle zwei Book-Instanzen mit Book:new()
-- TODO: Gib jedes book direkt aus (verwende einfach print(book))
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
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-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-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Übe selbstständig: Online-Lua-Compiler