Menu
CoddyTech

Objekte subtrahieren

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 27 von 70.

Genau wie __add den Operator + behandelt, definiert die Metamethode __sub das Verhalten des Operators -. Das Muster ist identisch. Du definierst eine Funktion, die zwei Operanden entgegennimmt 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)
end

Bei der Arbeit mit RGB-Farben kann die Subtraktion negative Werte ergeben. 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  80

Denk 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.

challenge icon

Aufgabe

Einfach

Lass uns eine Color-Klasse erstellen, die die Subtraktion mit dem Operator - unterstützt. Farben werden durch RGB-Werte dargestellt. Wenn eine Farbe von einer anderen subtrahiert wird, entsteht eine neue Farbe, deren Komponenten jeweils die Differenz der entsprechenden Komponenten bilden.

Du verteilst deinen Code auf zwei Dateien:

  • Color.lua: Definiere deine Color-Klasse mit den Komponenten r, g und b, die für die Werte von Rot, Grün und Blau stehen. Füge einen Konstruktor :new(r, g, b) hinzu und implementiere die Metamethode __sub, sodass beim Subtrahieren zweier Farben eine neue Farbe mit den komponentenweisen Differenzen entsteht. Denk daran, dass __sub die Punktnotation verwendet und beide Operanden als Argumente erhält.
  • main.lua: Binde dein Color-Modul ein, erstelle aus den angegebenen Eingaben Farbinstanzen, subtrahiere sie und gib die resultierenden RGB-Werte aus.

Du erhältst sechs Eingaben:

  1. Rotkomponente der ersten Farbe
  2. Grünkomponente der ersten Farbe
  3. Blaukomponente der ersten Farbe
  4. Rotkomponente der zweiten Farbe
  5. Grünkomponente der zweiten Farbe
  6. Blaukomponente 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 so aussehen:

150
120
80

Die erste Farbe (200, 150, 100) minus die zweite Farbe (50, 30, 20) ergibt eine neue Farbe (150, 120, 80).

Probier es selbst

-- Das Modul Color mit require laden
local Color = require('Color')

-- Eingabewerte einlesen
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: Zwei Color-Instanzen mit den angegebenen RGB-Werten erstellen

-- TODO: Die zweite Farbe mit dem Operator - von der ersten subtrahieren

-- TODO: Die Werte r, g und b der resultierenden Farbe jeweils in einer eigenen Zeile ausgeben
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler