Objekte verketten
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 28 von 70.
Der Operator .. in Lua verkettet Zeichenketten. Aber was, wenn du ein Objekt mit einer Zeichenkette kombinieren möchtest? Mit der Metamethode __concat kannst du genau festlegen, wie das 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 Zeichenkettenausdrü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 die Zeichenkette ist. Da .. sowohl als "Hello " .. obj als auch als 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 wird __concat konventionsgemäß mit einem Punkt geschrieben 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
EinfachLass uns eine Klasse Title erstellen, die sich mit dem Operator .. natürlich in Zeichenkettenausdrücke einfügt. Das ist nützlich, wenn du Objekte auf lesbare, intuitive Weise mit Zeichenketten kombinieren möchtest, zum Beispiel, um einer Anrede einen Titel oder ein Suffix hinzuzufügen.
Du verteilst deinen Code auf zwei Dateien:
Title.lua: Definiere deine Klasse Title mit einem Feldtext, in dem die Titelzeichenkette gespeichert wird. Füge einen Konstruktor:new(text)hinzu und implementiere die Metamethode__concat. 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 passend mit dem Text des Titels kombinieren.main.lua: Binde dein Title-Modul ein, erstelle eine Titelinstanz und demonstriere die Verkettung in beide Richtungen.
Du erhältst drei Eingaben:
- Den Titeltext (z. B. "Engineer")
- Eine Präfixzeichenkette, die vor dem Titel stehen soll (z. B. "Senior ")
- Eine Suffixzeichenkette, die nach dem Titel stehen soll (z. B. " III")
Erstelle in deiner Hauptdatei ein Title-Objekt mit dem angegebenen Text. Führe dann zwei Verkettungen durch und gib jedes Ergebnis in einer separaten 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 die Verknüpfung des Präfixes mit dem Titel, und die zweite Zeile zeigt die Verknüpfung des Titels mit dem Suffix. Deine Metamethode __concat ermöglicht diese natürliche Verkettung von Zeichenketten!
Probier es selbst
-- Eingaben einlesen
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()
-- Das Title-Modul laden
local Title = require('Title')
-- TODO: Eine Title-Instanz mit dem angegebenen titleText erstellen
-- TODO: prefix mit dem Title-Objekt verketten und das Ergebnis ausgeben
-- TODO: Das Title-Objekt mit suffix verketten und das Ergebnis ausgeben
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