Menu
Coddy logo textTech

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, anzupassen, wie sich Objekte verhalten. Nun erweitern wir dies auf arithmetische Operationen, beginnend 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 und nicht mit einem Doppelpunkt definiert wird. Es erhält beide Operanden als Argumente und 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 zentrale Erkenntnis ist, dass sich __add in der Metatabelle selbst befinden muss (hier: Vector), nicht nur im Objekt. Da wir Vector als Metatabelle für alle Instanzen festlegen, teilen sie automatisch dieses Verhalten.

challenge icon

Aufgabe

Einfach

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

Du wirst deinen Code auf zwei Dateien verteilen:

  • Vector.lua: Definiere deine Vector-Klasse mit den Komponenten x und y. Füge einen :new(x, y)-Konstruktor hinzu und implementiere die __add-Metamethode, sodass die Addition zweier Vektoren einen neuen Vektor mit den kombinierten Komponenten erstellt. Denke daran, dass __add die Punkt-Syntax (nicht den Doppelpunkt) verwendet und beide Operanden als Argumente erhält.
  • main.lua: Fordere dein Vector-Modul an, erstelle Vektorinstanzen und zeige, dass ihre Addition das korrekte 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 gegebenen Komponenten, addiere sie mithilfe des Operators + und gib die Werte x und y des resultierenden Vektors in separaten Zeilen aus.

Wenn die Eingaben beispielsweise 3, 4, 1, 2 lauten, sollte die Ausgabe wie folgt aussehen:

4
6

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

ERFORDERLICHES AUSGABEFORMAT: [Dein übersetzter Inhalt hier]

Probier es selbst

-- Lade das Vector-Modul
local Vector = require('Vector')

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

-- TODO: Erstelle zwei Vector-Instanzen mit den Eingabewerten

-- TODO: Addiere die beiden Vektoren mit dem +-Operator

-- TODO: Gib die x- und y-Werte des resultierenden Vektors in separaten Zeilen 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