Menu
Coddy logo textTech

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
end

Beachte, 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 PhD

Wie 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.

challenge icon

Aufgabe

Einfach

Erstellen 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 einem text-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:

  1. Den Titeltext (z. B. „Engineer“)
  2. Eine Präfixzeichenkette, die vor dem Titel platziert werden soll (z. B. „Senior “)
  3. 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:

  1. Verknüpfe die Präfixzeichenkette mit dem Titelobjekt
  2. 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 III

Die 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler