Objekte verketten
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 28 von 70.
Der ..-Operator in Lua verkettet Zeichenfolgen. Doch was ist, wenn du ein Objekt mit einer Zeichenfolge kombinieren möchtest? Mit der __concat-Metamethode kannst du genau festlegen, wie dies funktionieren soll.
Wenn Lua auf a .. b trifft und ein Operand eine __concat-Metamethode hat, ruft es diese Funktion mit beiden Werten auf. Das ist nützlich, wenn Objekte sich natürlich in String-Ausdrücke einfügen sollen.
local Name = {}
Name.__index = Name
function Name:new(first, last)
local obj = {first = first, last = last}
setmetatable(obj, Name)
return obj
end
function Name.__concat(a, b)
if type(a) == "string" then
return a .. b.first .. " " .. b.last
else
return a.first .. " " .. a.last .. b
end
endBeachte, dass die Funktion prüft, welcher Operand der String ist. Da .. als "Hello " .. obj oder obj .. "!" verwendet werden kann, sollte deine Metamethode beide Fälle behandeln.
local person = Name:new("Ada", "Lovelace")
print("Dr. " .. person) -- Ausgabe: Dr. Ada Lovelace
print(person .. " PhD") -- Ausgabe: Ada Lovelace PhDWie andere Operator-Metamethoden verwendet __concat die Punktsyntax und erhält beide Operanden als Argumente. Der wesentliche Unterschied zu arithmetischen Metamethoden besteht darin, dass du typischerweise mit gemischten Typen arbeitest: deinem Objekt und einer Zeichenkette.
Aufgabe
EinfachErstellen wir eine Title-Klasse, die sich mithilfe des Operators .. natürlich in Zeichenkettenausdrücke einfügt. Das ist nützlich, wenn du Objekte auf lesbare und intuitive Weise mit Zeichenketten kombinieren möchtest, etwa um Ehrentitel oder Suffixe an einen Titel einer Person anzuhängen.
Du organisierst deinen Code auf zwei Dateien verteilt:
Title.lua: Definiere deine Title-Klasse mit einemtext-Feld, das die Titelzeichenkette speichert. Füge einen:new(text)-Konstruktor hinzu und implementiere die__concat-Metamethode. Deine Metamethode sollte beide Fälle behandeln: wenn eine Zeichenkette vor dem Objekt steht ("prefix" .. obj) und wenn eine Zeichenkette danach steht (obj .. "suffix"). Das Ergebnis sollte die Zeichenkette und den Titeltext passend kombinieren.main.lua: Binde dein Title-Modul ein, erstelle eine Titelinstanz und demonstriere die Verkettung in beiden Richtungen.
Du erhältst drei Eingaben:
- Den Titeltext (z. B. „Engineer“)
- Eine Präfixzeichenkette, die vor dem Titel platziert werden soll (z. B. „Senior “)
- Eine Suffixzeichenkette, die nach dem Titel platziert werden soll (z. B. „ III“)
Erstelle in deiner Hauptdatei einen Title mit dem angegebenen Text. Führe dann zwei Verkettungen durch und gib jedes Ergebnis in einer eigenen Zeile aus:
- Verknüpfe die Präfixzeichenkette mit dem Titelobjekt
- Verknüpfe das Titelobjekt mit der Suffixzeichenkette
Wenn die Eingaben beispielsweise Engineer, Senior und III lauten, sollte die Ausgabe wie folgt aussehen:
Senior Engineer
Engineer IIIDie erste Zeile zeigt das Präfix in Verbindung mit dem Titel, und die zweite Zeile zeigt den Titel in Verbindung mit dem Suffix. Deine __concat-Metamethode ermöglicht diese natürliche Zeichenkettenverknüpfung!
Probier es selbst
-- Eingaben lesen
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()
-- Title-Modul laden
local Title = require('Title')
-- TODO: Erstelle eine Title-Instanz mit dem gegebenen titleText
-- TODO: Verkette prefix mit dem title-Objekt und gib das Ergebnis aus
-- TODO: Verkette das title-Objekt mit suffix und gib das Ergebnis aus
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