Intégrer Comparable à vos classes
Publié par Nico
Dans le dernier billet nous avons vu comment intégrer le module Enumerable à vos classes Ruby. Aujourd’hui nous verrons comment faire de même avec le module Comparable.
Comparable permet d’ajouter des méthodes de tri et de comparaison à vos classes telles que <, between?, sort.
Encore une fois il suffit d’écrire une méthode qui donnera les bases au module Comparable.
La théorie
Toute classe voulant utiliser les capactités du module Comparable doit implémenter une méthode <=>. Cette méthode doit pouvoir comparer deux objets sur un critère dont vous êtes le seul juge et renvoyer une valeur (-1, 0 ou 1) qui indique quel est le plus grand élément ou s’ils sont égaux.
1 <=> 2
# => -1
2 <=> 1
# => 1
2 <=> 2
# => 0Définir <=> et inclure le module Comparable dans votre classe, c’est ajouter le possibilité à votre classe de trier des collections et d’effectuer des comparaisons entre deux objets.
Voyons maintenant comment mettre cela en place.
La pratique
Prenons un exemple simpliste mais qui résume bien la façon de mettre en place les fonctionnalités de Comparable dans vos propres classes. Nous allons écrire une classe qui pour ses comparaisons se basera sur la taille des chaînes qui lui sont passées.
class Taille
include Comparable
attr :str
def <=>(autre)
str.size <=> autre.str.size
end
def initialize(str)
@str = str
end
def inspect
@str
end
end
# Utilisation de la classe
s1 = Taille.new("Z")
s2 = Taille.new("YY")
s3 = Taille.new("XXX")
s4 = Taille.new("WWWW")
s5 = Taille.new("VVVVV")
s1 < s2
# => true
s4.between?(s1, s3)
# => false
s4.between?(s3, s5)
# => true
[ s3, s2, s5, s4, s1 ].sort
# => [Z, YY, XXX, WWWW, VVVVV]En incluant le module Comparable ainsi qu’en définissant la méthode de comparaisons (<=>), on donc accès à toutes les méthodes de comparaison et de tri pour notre classe.
Quelques explications
Nous incluons tout d’abord le module Comparable pour préciser que l’on souhaite faire usage de ses possibilités.
Il ne nous reste plus qu’a écrire la méthode de comparaison (<=>) qui va se charger de comparer une spécificité de notre objet courant avec celle d’un autre objet passé en paramètre. Dans notre exemple, nous comparons la taille de la chaîne.
Voilà, nous avons maintenant à disposition dans notre classe tous les outils de comparaison dont nous avons besoin. Notre exemple le démontre en utilisant les méthodes <, between? et sort.
Conclusion
L’ajout de méthode de comparaison est donc chose aisée. Si votre classe a besoin de pouvoir comparer ses instances entre elles, pensez à inclure le module Comparable et à écrire une méthode <=>. Votre classe gagnera en quelques minutes la possibilité de comparer et trier ses instances.

