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)
endBeachte, 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 6Die 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.
Aufgabe
EinfachLass 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 Komponentenxundy. 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__adddie 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:
- x-Komponente des ersten Vektors
- y-Komponente des ersten Vektors
- x-Komponente des zweiten Vektors
- 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
6Der erste Vektor (3, 4) plus der zweite Vektor (1, 2) ergibt einen neuen Vektor (4, 6).
ERFORDERLICHES AUSGABEFORMAT: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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
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-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-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Übe selbstständig: Online-Lua-Compiler