Menu
Coddy logo textTech

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
end

Avec __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 : false

Voici 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.

challenge icon

Défi

Facile

Construisons 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 champs name et price. Inclus un constructeur :new(name, price) et implémente la métaméthode __lt pour comparer les produits en fonction de leur prix. Souviens-toi que définir __lt te 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 :

  1. Le nom du premier produit
  2. Le prix du premier produit
  3. Le nom du deuxième produit
  4. 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 :

  1. Le premier produit est-il inférieur au deuxième ? (affiche true ou false)
  2. Le premier produit est-il supérieur au deuxième ? (affiche true ou false)
  3. 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
Apple

Apple (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
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur Lua en ligne