Menu
CoddyTech

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
end

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

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

challenge icon

Aufgabe

Einfach

Lass 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 Feld text, 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:

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

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