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
endDa __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: falseHier 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.
Aufgabe
EinfachErstelle 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 Feldernnameundprice. 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__ltautomatisch 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:
- Name des ersten Produkts
- Preis des ersten Produkts
- Name des zweiten Produkts
- 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:
- Ist das erste Produkt kleiner als das zweite? (Gib
trueoderfalseaus.) - Ist das erste Produkt größer als das zweite? (Gib
trueoderfalseaus.) - 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
AppleApple (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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
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-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-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Übe selbstständig: Online-Lua-Compiler