Objekte subtrahieren
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 27 von 70.
Genauso wie __add den +-Operator verarbeitet, definiert die __sub-Metamethode das Verhalten für den --Operator. Das Muster ist identisch – Sie definieren eine Funktion, die zwei Operanden erhält 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)
endBeim Arbeiten mit RGB-Farben kann die Subtraktion negative Werte erzeugen. In realen Anwendungen möchten Sie die Ergebnisse möglicherweise auf gültige Bereiche (0-255) begrenzen, aber die grundlegende Metamethoden-Struktur bleibt dieselbe.
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 80Denken Sie daran: Definieren Sie __sub mit einem Punkt (nicht mit einem Doppelpunkt), da es sich um eine Metamethode handelt, die Lua direkt mit beiden Operanden als Argumente aufruft.
Aufgabe
EinfachLassen Sie uns eine Color-Klasse erstellen, die Subtraktion mit dem --Operator unterstützt. Farben werden durch RGB-Werte dargestellt, und das Subtrahieren einer Farbe von einer anderen erzeugt eine neue Farbe mit der Differenz jeder Komponente.
Sie werden Ihren Code auf zwei Dateien verteilen:
Color.lua: Definieren Sie Ihre Color-Klasse mit den Komponentenr,gundb, die Rot-, Grün- und Blauwerte darstellen. Fügen Sie einen:new(r, g, b)-Konstruktor hinzu und implementieren Sie die Metamethode__sub, sodass das Subtrahieren zweier Farben eine neue Farbe mit den komponentenweisen Differenzen erzeugt. Denken Sie daran, dass__subdie Punkt-Syntax verwendet und beide Operanden als Argumente erhält.main.lua: Binden Sie Ihr Color-Modul ein, erstellen Sie Farbinstanzen aus den bereitgestellten Eingaben, subtrahieren Sie diese und zeigen Sie die resultierenden RGB-Werte an.
Sie erhalten sechs Eingaben:
- Rot-Komponente der ersten Farbe
- Grün-Komponente der ersten Farbe
- Blau-Komponente der ersten Farbe
- Rot-Komponente der zweiten Farbe
- Grün-Komponente der zweiten Farbe
- Blau-Komponente der zweiten Farbe
Erstellen Sie in Ihrer Hauptdatei zwei Farben mit den angegebenen RGB-Werten, subtrahieren Sie die zweite Farbe von der ersten mit dem --Operator und geben Sie die r-, g- und b-Werte der resultierenden Farbe in separaten Zeilen aus.
Wenn die Eingaben beispielsweise 200, 150, 100, 50, 30, 20 sind, sollte die Ausgabe wie folgt aussehen:
150
120
80Die erste Farbe (200, 150, 100) minus der zweiten Farbe (50, 30, 20) ergibt eine neue Farbe (150, 120, 80).
Spickzettel
Die Metamethode __sub definiert das Verhalten für den Operator -. Sie erhält zwei Operanden und gibt ein neues Objekt zurück.
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endDefinieren Sie __sub mit einem Punkt (nicht mit einem Doppelpunkt), da es sich um eine Metamethode handelt, die Lua direkt mit beiden Operanden als Argumente aufruft.
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 80Probier es selbst
-- Das 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 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