Menu
Coddy logo textTech

Objekte vergleichen (<, >)

Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 29 von 70.

Über Arithmetik und Verkettung hinaus können Sie mithilfe von Vergleichs-Metamethoden auch definieren, wie Objekte miteinander verglichen werden. Die Metamethode __lt verarbeitet den „kleiner als“ (<code><) Operator.

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

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

Mit definiertem __lt können Sie nun Elemente 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 ist der clevere Teil: Lua leitet den -Operator automatisch von __lt ab. Wenn Sie a > b schreiben, wertet Lua stattdessen einfach b < a aus. Das Definieren von nur __lt gibt Ihnen also beide Vergleichsrichtungen kostenlos.

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine Product-Klasse erstellen, die mithilfe der Operatoren <code>< und basierend auf dem Preis verglichen werden kann. Dies ist ideal für Szenarien wie das Sortieren von Artikeln in einem Warenkorb oder das Finden der günstigsten Option in einer Liste.

Sie werden Ihren Code auf zwei Dateien aufteilen:

  • Product.lua: Definieren Sie Ihre Product-Klasse mit den Feldern name und price. Fügen Sie einen :new(name, price)-Konstruktor hinzu und implementieren Sie die Metamethode __lt, um Produkte nach ihrem Preis zu vergleichen. Denken Sie daran, dass das Definieren von __lt Ihnen automatisch auch den -Operator gibt – Lua erledigt das für Sie!
  • main.lua: Binden Sie Ihr Product-Modul ein, erstellen Sie Produktinstanzen aus den Eingaben und vergleichen Sie diese, um festzustellen, welches mehr oder weniger kostet.

Sie erhalten vier Eingaben:

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

Erstellen Sie in Ihrer Hauptdatei zwei Produkte mit den angegebenen Namen und Preisen. Führen Sie dann drei Vergleiche durch und geben Sie das Ergebnis jedes Vergleichs in einer separaten Zeile aus:

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

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

true
false
Apple

Der Apple (Preis 2) ist kleiner als der Laptop (Preis 999), daher ist der erste Vergleich true. Der Apple ist nicht größer als der Laptop, daher ist der zweite Vergleich false. Und da Apple den niedrigeren Preis hat, wird er als das günstigere Produkt ausgegeben.

Spickzettel

Die Metamethode __lt verarbeitet den „kleiner als“ (<code><) Operator für benutzerdefinierte Objekte.

Wenn Lua a < b auswertet, sucht es nach __lt in der Metatabelle. Diese Metamethode sollte basierend auf Ihrer 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

Mit definiertem __lt können Sie Elemente direkt vergleichen:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)

print(apple < laptop)   -- Ausgabe: true
print(laptop < apple)   -- Ausgabe: false

Lua leitet den -Operator automatisch von __lt ab. Wenn Sie a > b schreiben, wertet Lua stattdessen b < a aus. Die Definition von nur __lt ermöglicht Ihnen beide Vergleichsrichtungen.

Probier es selbst

-- Erfordert das Product-Modul
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: Erstellen Sie zwei Product-Instanzen mit Product:new()

-- TODO: Vergleichen Sie Produkte mit dem <-Operator und geben Sie true/false aus

-- TODO: Vergleichen Sie Produkte mit dem >-Operator und geben Sie true/false aus

-- TODO: Geben Sie 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 Object Oriented Programming