Menu
CoddyTech

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 entre eux à l’aide de métaméthodes de comparaison. La métaméthode __lt gère l’opérateur « inférieur à » (<).

Lorsque Lua évalue a < b, il recherche __lt dans la métatable. Cette métaméthode doit renvoyer 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
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 sens de comparaison.

challenge icon

Défi

Facile

Construisons une classe Product qui peut être comparée à l’aide des opérateurs < et > en fonction du prix. C’est parfait pour des scénarios comme le tri d’articles dans un panier ou la recherche de l’option la moins chère dans une liste.

Vous allez organiser votre code sur deux fichiers :

  • Product.lua : définissez votre classe Product avec les champs name et price. Incluez un constructeur :new(name, price) et implémentez la métaméthode __lt pour comparer les produits selon leur prix. N’oubliez pas que la définition de __lt vous fournit automatiquement l’opérateur > également : Lua s’en charge pour vous !
  • main.lua : importez votre module Product, créez des instances de produit à partir des entrées et comparez-les afin de déterminer lequel coûte plus ou moins cher.

Vous recevrez quatre entrées :

  1. Nom du premier produit
  2. Prix du premier produit
  3. Nom du deuxième produit
  4. Prix du deuxième produit

Dans votre fichier principal, créez deux produits avec les noms et les prix fournis. Effectuez ensuite trois comparaisons et affichez le résultat de chacune sur une ligne distincte :

  1. Le premier produit est-il moins cher que le deuxième ? (affichez true ou false)
  2. Le premier produit est-il plus cher que le deuxième ? (affichez true ou false)
  3. Affichez le nom du produit le moins cher

Par exemple, si les entrées sont Apple, 2, Laptop et 999, la sortie doit être :

true
false
Apple

Apple (au prix de 2) est moins cher que Laptop (au prix de 999), la première comparaison est donc true. Apple n’est pas plus cher que 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