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
endMit 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: falseHier 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.
Aufgabe
EinfachLassen 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 Feldernnameundprice. 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__ltIhnen 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:
- Name des ersten Produkts
- Preis des ersten Produkts
- Name des zweiten Produkts
- 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:
- Ist das erste Produkt kleiner als das zweite? (geben Sie
trueoderfalseaus) - Ist das erste Produkt größer als das zweite? (geben Sie
trueoderfalseaus) - 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
AppleDer 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
endMit 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: falseLua 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
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
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-Klasse2Klassen-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