Comparer des objets (<, >)
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 29 sur 70.
Au-delà de l'arithmétique et de la concaténation, vous pouvez également définir comment les objets se comparent les uns aux autres en utilisant des métaméthodes de comparaison. La métaméthode __lt gère l'opérateur « inférieur à » (<code><).
Lorsque Lua évalue a < b, il recherche __lt dans la métatable. Cette métaméthode doit retourner true ou false en fonction de votre logique de comparaison.
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
endAvec __lt défini, vous pouvez maintenant comparer des articles directement :
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- Output: true
print(laptop < apple) -- Output: falseVoici la partie ingénieuse : Lua dérive automatiquement l'opérateur à partir de __lt. Lorsque vous écrivez a > b, Lua évalue simplement b < a à la place. Ainsi, définir seulement __lt vous donne les deux sens de comparaison gratuitement.
Défi
FacileConstruisons une classe Product qui peut être comparée à l'aide des opérateurs <code>< et en fonction du prix. C'est parfait pour des scénarios comme le tri d'articles dans un panier d'achat ou la recherche de l'option la moins chère dans une liste.
Vous organiserez votre code sur deux fichiers :
Product.lua: Définissez votre classe Product avec les champsnameetprice. Incluez un constructeur:new(name, price)et implémentez la métaméthode__ltpour comparer les produits par leur prix. Rappelez-vous que la définition de__ltvous donne automatiquement l'opérateurégalement — Lua s'en occupe pour vous !main.lua: Importez votre module Product, créez des instances de produits à partir des entrées, et comparez-les pour déterminer lequel coûte plus ou moins cher.
Vous recevrez quatre entrées :
- Le nom du premier produit
- Le prix du premier produit
- Le nom du deuxième produit
- Le prix du deuxième produit
Dans votre fichier principal, créez deux produits avec les noms et prix donnés. Effectuez ensuite trois comparaisons et affichez le résultat de chacune sur une ligne distincte :
- Le premier produit est-il inférieur au deuxième ? (affichez
trueoufalse) - Le premier produit est-il supérieur au deuxième ? (affichez
trueoufalse) - Affichez le nom du produit le moins cher
Par exemple, si les entrées sont Apple, 2, Laptop, et 999, la sortie devrait être :
true
false
AppleL'Apple (prix 2) est inférieur au Laptop (prix 999), donc la première comparaison est true. L'Apple n'est pas supérieur au Laptop, donc la deuxième est false. Et comme Apple a le prix le plus bas, il est affiché comme le produit le moins cher.
Aide-mémoire
La métaméthode __lt gère l'opérateur « inférieur à » (<code><) pour les objets personnalisés.
Lorsque Lua évalue a < b, il recherche __lt dans la métatable. Cette métaméthode doit retourner true ou false selon votre logique de comparaison.
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
endAvec __lt défini, vous pouvez comparer les articles directement :
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- Résultat : true
print(laptop < apple) -- Résultat : falseLua dérive automatiquement l'opérateur à partir de __lt. Lorsque vous écrivez a > b, Lua évalue b < a à la place. Définir seulement __lt vous donne les deux sens de comparaison.
Essayez vous-même
-- Requiert le module Product
local Product = require('Product')
-- Lit les entrées
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())
-- TODO: Créer deux instances de Product en utilisant Product:new()
-- TODO: Comparer les produits en utilisant l'opérateur < et afficher true/false
-- TODO: Comparer les produits en utilisant l'opérateur > et afficher true/false
-- TODO: Afficher le nom du produit le moins cher
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse Rectangle2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes