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
endDa __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: falseHier 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.
Aufgabe
EinfachLass 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 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__ltdir automatisch auch den Operatorgibt: 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:
- 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 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
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