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)
endBeachte, 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 6Die 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.
Aufgabe
EinfachLass 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 Komponentenxundy. 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__addmit 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:
- 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 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
6Der 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
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