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)
endBeachten 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 6Die 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.
Aufgabe
EinfachLassen 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 Komponentenxundy. 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__adddie 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:
- X-Komponente des ersten Vektors
- Y-Komponente des ersten Vektors
- X-Komponente des zweiten Vektors
- 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
6Der 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
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
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-Klasse2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-Check