Menu
CoddyTech

Objekte addieren

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 26 von 70.

Du hast bereits gesehen, wie Metamethoden wie __tostring und __eq es dir ermöglichen, das Verhalten von Objekten anzupassen. Jetzt erweitern wir das auf arithmetische Operationen und beginnen mit der Addition.

Die Metamethode __add legt fest, was passiert, wenn du den Operator + zwischen zwei Objekten verwendest. Wenn Lua a + b sieht, sucht es in der Metatabelle eines der beiden Operanden nach __add.

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
    local obj = {x = x, y = y}
    setmetatable(obj, Vector)
    return obj
end

function Vector.__add(v1, v2)
    return Vector:new(v1.x + v2.x, v1.y + v2.y)
end

Beachte, dass __add mit einem Punkt definiert wird. Lua übergibt beide Operanden als einfache Argumente, und die Punktform benennt beide. Ein Doppelpunkt würde ebenfalls funktionieren, da function Vector:__add(other) dasselbe ist wie function Vector.__add(self, other), aber die Punktform ist die Konvention. __add sollte ein neues Objekt zurückgeben, anstatt eines der ursprünglichen Objekte zu verändern. Dadurch bleibt die Operation vorhersehbar und sicher.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- Ausgabe: 4  6

Die entscheidende Erkenntnis ist, dass __add in der Metatabelle selbst stehen muss (hier Vector), nicht nur im Objekt. Da wir Vector als Metatabelle für alle Instanzen festlegen, teilen sie dieses Verhalten automatisch.

challenge icon

Aufgabe

Einfach

Lass uns eine Vector-Klasse erstellen, die die Addition mit dem Operator + unterstützt. Das ist dein erster Schritt in Richtung Operatorüberladung, durch die deine Objekte auf natürliche Weise mit den eingebauten Operatoren von Lua funktionieren.

Du verteilst deinen Code auf zwei Dateien:

  • Vector.lua: Definiere deine Vector-Klasse mit den Komponenten x und y. Füge einen Konstruktor :new(x, y) hinzu und implementiere die Metamethode __add, sodass beim Addieren zweier Vektoren ein neuer Vektor mit den kombinierten Komponenten entsteht. Definiere __add mit Punktnotation, damit beide Operanden als benannte Argumente übergeben werden.
  • main.lua: Binde dein Vector-Modul ein, erstelle Vektorinstanzen und zeige, dass ihre Addition das richtige Ergebnis liefert.

Du erhältst vier Eingaben:

  1. x-Komponente des ersten Vektors
  2. y-Komponente des ersten Vektors
  3. x-Komponente des zweiten Vektors
  4. y-Komponente des zweiten Vektors

Erstelle in deiner Hauptdatei zwei Vektoren mit den angegebenen Komponenten, addiere sie mit dem Operator + und gib die Werte x und y des resultierenden Vektors in getrennten Zeilen aus.

Wenn die Eingaben beispielsweise 3, 4, 1, 2 lauten, sollte die Ausgabe folgendermaßen aussehen:

4
6

Der erste Vektor (3, 4) plus der zweite Vektor (1, 2) ergibt einen neuen Vektor (4, 6).

Probier es selbst

-- Das Vector-Modul laden
local Vector = require('Vector')

-- Eingabe einlesen
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: Zwei Vector-Instanzen aus den Eingabewerten erstellen

-- TODO: Die beiden Vektoren mit dem Operator + addieren

-- TODO: Die x- und y-Werte des Ergebnisvektors in getrennten Zeilen 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