Menu
Coddy logo textTech

Objekte addieren

Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 26 von 70.

Sie haben bereits gesehen, wie Metamethoden wie __tostring und __eq es Ihnen ermöglichen, das Verhalten von Objekten anzupassen. Nun werden wir dies auf arithmetische Operationen ausweiten, beginnend mit der Addition.

Die Metamethode __add definiert, was passiert, wenn Sie den Operator + zwischen zwei Objekten verwenden. Wenn Lua a + b sieht, sucht es nach __add in der Metatabelle eines der Operanden.

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

Beachten Sie, dass __add mit einem Punkt definiert wird, nicht mit einem Doppelpunkt. Es erhält beide Operanden als Argumente und sollte ein neues Objekt zurückgeben, anstatt eines der Originale zu verändern. Dies hält 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 sich in der Metatabelle selbst befinden muss (hier, Vector), nicht nur im Objekt. Da wir Vector als Metatabelle für alle Instanzen festgelegt haben, teilen sie dieses Verhalten automatisch.

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine Vector-Klasse erstellen, die die Addition mit dem +-Operator unterstützt. Dies ist Ihr erster Schritt in die Überladung von Operatoren – damit Ihre Objekte natürlich mit den integrierten Operatoren von Lua funktionieren.

Sie werden Ihren Code auf zwei Dateien verteilen:

  • Vector.lua: Definieren Sie Ihre Vector-Klasse mit den Komponenten x und y. Fügen Sie einen :new(x, y)-Konstruktor hinzu und implementieren Sie die Metamethode __add, sodass das Addieren zweier Vektoren einen neuen Vektor mit den kombinierten Komponenten erstellt. Denken Sie daran, dass __add die Punkt-Syntax (nicht den Doppelpunkt) verwendet und beide Operanden als Argumente erhält.
  • main.lua: Binden Sie Ihr Vector-Modul ein, erstellen Sie Vektor-Instanzen und demonstrieren Sie, dass deren Addition das korrekte Ergebnis liefert.

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

Erstellen Sie in Ihrer Hauptdatei zwei Vektoren mit den gegebenen Komponenten, addieren Sie diese mit dem +-Operator und geben Sie die x- und y-Werte des resultierenden Vektors in separaten Zeilen aus.

Wenn die Eingaben beispielsweise 3, 4, 1, 2 sind, 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).

Spickzettel

Die Metamethode __add definiert, was passiert, wenn Sie den Operator + zwischen zwei Objekten verwenden.

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

__add wird mit einem Punkt definiert, nicht mit einem Doppelpunkt. Sie erhält beide Operanden als Argumente und sollte ein neues Objekt zurückgeben, anstatt eines der Originale zu verändern.

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

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

__add muss sich in der Metatabelle selbst befinden, nicht nur im Objekt.

Probier es selbst

-- Erfordert 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 unter Verwendung der Eingabewerte

-- 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 Object Oriented Programming