Menu
CoddyTech

Objekte vergleichen (<, >)

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

Neben arithmetischen Operationen und Verkettung kannst du auch festlegen, wie Objekte miteinander verglichen werden, indem du Vergleichsmetamethoden verwendest. Die __lt-Metamethode verarbeitet den Operator „kleiner als“ (<).

Wenn Lua a < b auswertet, sucht es in der Metatabelle nach __lt. Diese Metamethode sollte basierend auf deiner Vergleichslogik true oder false zurückgeben.

local Item = {}
Item.__index = Item
function Item:new(name, price)
    local obj = {name = name, price = price}
    setmetatable(obj, Item)
    return obj
end
function Item.__lt(a, b)
    return a.price < b.price
end

Da __lt definiert ist, kannst du Elemente nun direkt vergleichen:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop)   -- Ausgabe: true
print(laptop < apple)   -- Ausgabe: false

Hier kommt der clevere Teil: Lua leitet den Operator > automatisch aus __lt ab. Wenn du a > b schreibst, wertet Lua stattdessen einfach b < a aus. Wenn du nur __lt definierst, erhältst du beide Vergleichsrichtungen kostenlos.

challenge icon

Aufgabe

Einfach

Erstelle eine Product-Klasse, die anhand des Preises mit den Operatoren < und > verglichen werden kann. Das ist ideal für Szenarien wie das Sortieren von Artikeln in einem Warenkorb oder das Finden der günstigsten Option in einer Liste.

Du wirst deinen Code auf zwei Dateien verteilen:

  • Product.lua: Definiere deine Product-Klasse mit den Feldern name und price. Füge einen :new(name, price)-Konstruktor hinzu und implementiere die __lt-Metamethode, um Produkte anhand ihres Preises zu vergleichen. Denke daran, dass die Definition von __lt automatisch auch den Operator > bereitstellt: Lua übernimmt das für dich!
  • main.lua: Binde dein Product-Modul ein, erstelle aus den Eingaben Produktinstanzen und vergleiche sie, um zu bestimmen, welches mehr oder weniger kostet.

Du erhältst vier Eingaben:

  1. Name des ersten Produkts
  2. Preis des ersten Produkts
  3. Name des zweiten Produkts
  4. Preis des zweiten Produkts

Erstelle in deiner Hauptdatei zwei Produkte mit den angegebenen Namen und Preisen. Führe dann drei Vergleiche durch und gib das Ergebnis jedes Vergleichs in einer eigenen Zeile aus:

  1. Ist das erste Produkt kleiner als das zweite? (Gib true oder false aus.)
  2. Ist das erste Produkt größer als das zweite? (Gib true oder false aus.)
  3. Gib den Namen des günstigeren Produkts aus.

Wenn die Eingaben beispielsweise Apple, 2, Laptop und 999 lauten, sollte die Ausgabe wie folgt aussehen:

true
false
Apple

Apple (Preis 2) ist kleiner als Laptop (Preis 999), daher ist der erste Vergleich true. Apple ist nicht größer als Laptop, daher ist das zweite Ergebnis false. Da Apple außerdem den niedrigeren Preis hat, wird es als günstigeres Produkt ausgegeben.

Probier es selbst

-- Das Product-Modul einbinden
local Product = require('Product')

-- Eingaben lesen
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())

-- TODO: Erstelle zwei Product-Instanzen mit Product:new()

-- TODO: Vergleiche Produkte mit dem < Operator und gib true/false aus

-- TODO: Vergleiche Produkte mit dem > Operator und gib true/false aus

-- TODO: Gib den Namen des günstigeren Produkts aus
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