Objekte subtrahieren
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 27 von 70.
So wie __add den Operator + behandelt, definiert die Metamethode __sub das Verhalten für den Operator -. Das Muster ist identisch. Du definierst eine Funktion, die zwei Operanden empfängt und ein neues Objekt zurückgibt.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endBei der Arbeit mit RGB-Farben kann die Subtraktion negative Werte erzeugen. In realen Anwendungen möchtest du die Ergebnisse möglicherweise auf gültige Bereiche (0-255) begrenzen, aber die grundlegende Struktur der Metamethode bleibt gleich.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- Ausgabe: 150 120 80Denke daran: Definiere __sub mit einem Punkt (nicht mit einem Doppelpunkt), da es sich um eine Metamethode handelt, die Lua direkt mit beiden Operanden als Argumenten aufruft.
Aufgabe
EinfachLass uns eine Color-Klasse erstellen, die die Subtraktion mit dem Operator - unterstützt. Farben werden durch RGB-Werte dargestellt, und wenn eine Farbe von einer anderen subtrahiert wird, entsteht eine neue Farbe mit der Differenz jeder Komponente.
Du wirst deinen Code auf zwei Dateien aufteilen:
Color.lua: Definiere deine Color-Klasse mit den Komponentenr,gundb, die rote, grüne und blaue Werte darstellen. Füge einen:new(r, g, b)-Konstruktor hinzu und implementiere die Metamethode__sub, sodass das Subtrahieren zweier Farben eine neue Farbe mit den komponentenweisen Differenzen erzeugt. Denke daran, dass__subdie Punktnotation verwendet und beide Operanden als Argumente erhält.main.lua: Fordere dein Color-Modul an, erstelle anhand der vorgegebenen Eingaben Farbinstanzen, subtrahiere sie und gib die resultierenden RGB-Werte aus.
Du erhältst sechs Eingaben:
- Rote Komponente der ersten Farbe
- Grüne Komponente der ersten Farbe
- Blaue Komponente der ersten Farbe
- Rote Komponente der zweiten Farbe
- Grüne Komponente der zweiten Farbe
- Blaue Komponente der zweiten Farbe
Erstelle in deiner Hauptdatei zwei Farben mit den angegebenen RGB-Werten, subtrahiere die zweite Farbe mithilfe des Operators - von der ersten und gib die Werte r, g und b der resultierenden Farbe in separaten Zeilen aus.
Wenn die Eingaben beispielsweise 200, 150, 100, 50, 30, 20 lauten, sollte die Ausgabe folgendermaßen aussehen:
150
120
80Die erste Farbe (200, 150, 100) minus die zweite Farbe (50, 30, 20) ergibt eine neue Farbe (150, 120, 80).
Probier es selbst
-- Color-Modul einbinden
local Color = require('Color')
-- Eingabewerte lesen
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: Erstelle zwei Color-Instanzen mit den gegebenen RGB-Werten
-- TODO: Subtrahiere die zweite Farbe von der ersten mit dem - Operator
-- TODO: Gib die r-, g- und b-Werte der resultierenden Farbe 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