Menu
Coddy logo textTech

Objekte vergleichen (<, >)

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

Über Arithmetik und Verkettung hinaus kannst du auch definieren, wie Objekte mithilfe von Vergleichs-Metamethoden miteinander verglichen werden. Die __lt-Metamethode verarbeitet den „less than“-<code><-operator.

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 jetzt 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 von __lt ab. Wenn du a > b schreibst, wertet Lua stattdessen einfach b < a aus. Wenn du nur __lt definierst, erhältst du also kostenlos beide Vergleichsrichtungen.

challenge icon

Aufgabe

Einfach

Lass uns eine Product-Klasse erstellen, die mithilfe der Operatoren <code>< und anhand des Preises 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 dir automatisch auch den Operator gibt: Lua übernimmt das für dich!
  • main.lua: Fordere dein Product-Modul an, erstelle anhand der 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 den niedrigeren Preis hat, wird es als günstigeres Produkt ausgegeben.

Probier es selbst

-- 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: Zwei Product-Instanzen mit Product:new() erstellen

-- TODO: Produkte mit dem < Operator vergleichen und true/false ausgeben

-- TODO: Produkte mit dem > Operator vergleichen und true/false ausgeben

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