Menu
Coddy logo textTech

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
end

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

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

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 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 champs name et price. Incluez un constructeur :new(name, price) et implémentez la métaméthode __lt pour comparer les produits par leur prix. Rappelez-vous que la définition de __lt vous 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 :

  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 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 :

  1. Le premier produit est-il inférieur au deuxième ? (affichez true ou false)
  2. Le premier produit est-il supérieur au 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 devrait être :

true
false
Apple

L'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
end

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

Lua 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
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 Object Oriented Programming