Comparer des objets (<, >)
Fait partie de la section Programmation orientée objet 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 la manière dont les objets se comparent les uns aux autres à l’aide de 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 renvoyer 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 directement les éléments :
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- Sortie : true
print(laptop < apple) -- Sortie : falseVoici la partie astucieuse : Lua déduit automatiquement l’opérateur à partir de __lt. Lorsque vous écrivez a > b, Lua évalue simplement b < a à la place. Ainsi, définir uniquement __lt vous donne gratuitement les deux directions de comparaison.
Défi
FacileConstruisons une classe Product qui peut être comparée à l'aide des opérateurs <code>< et en fonction du prix. C'est idéal pour des situations comme le tri d'articles dans un panier ou la recherche de l'option la moins chère dans une liste.
Tu organiseras ton code sur deux fichiers :
Product.lua: définis ta classe Product avec les champsnameetprice. Inclus un constructeur:new(name, price)et implémente la métaméthode__ltpour comparer les produits en fonction de leur prix. Souviens-toi que définir__ltte donne automatiquement aussi l'opérateur: Lua s'en charge pour toi !main.lua: importe ton module Product, crée des instances de produit à partir des entrées, puis compare-les pour déterminer lequel coûte plus ou moins cher.
Tu recevras 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 ton fichier principal, crée deux produits avec les noms et les prix donnés. Effectue ensuite trois comparaisons et affiche le résultat de chacune sur une ligne distincte :
- Le premier produit est-il inférieur au deuxième ? (affiche
trueoufalse) - Le premier produit est-il supérieur au deuxième ? (affiche
trueoufalse) - Affiche 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
AppleApple (au prix de 2) est inférieur à Laptop (au prix de 999), la première comparaison est donc true. Apple n'est pas supérieur à Laptop, la deuxième comparaison est donc false. Et puisque Apple a le prix le plus bas, son nom est affiché comme celui du produit le moins cher.
Essayez vous-même
-- Charger le module Product
local Product = require('Product')
-- Lire 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 Programmation orientée objet
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 RectangleClasse CercleMéthode PérimètreCollection de formesAire totaleFiltrer les formes2Modè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 formesEntraînez-vous par vous-même : Compilateur Lua en ligne