Hachages

Nous allons étudier dans cette section la classe Hash.

Les hachages ne sont rien d’autre que des tableaux spécialisés. Au lieu de n’accepter que des indices représentés par des nombres entiers (comme dans mon_tableau3), les hachages acceptent n’importe quel objet comme «index». Par exemple, vous pouvez écrire mon_hachage[“une_chaine_de_caractères”].

Supposons que nous voulons enregistrer des informations concernant un ami. Nous pourrions utiliser un tableau, comme ceci:

ami = [ "Jean-Paul", "Goret", "Rue de l'église, 26", "Houtsiplou", "Liège" ]

Évidemment, ceci fonctionnera. Mais nous allons devoir nous souvenir que ami0 pointe vers le prénom, ami1 vers le nom de famille, et ainsi de suite. Ceci peut se révéler fort compliqué par la suite.

C’est exactement le type de problème qu’un hachage peut résoudre. Voici la définition d’un hachage en Ruby:


ami = {
   "prénom"          => "Jean-Paul",
   "nom de famille"  => "Goret",
   "adresse"         => "Rue de l'église, 26",
   "ville"           => "Houtsiplou",
   "province"        => "Liège" 
}

Avertissement : Remarquez bien qu’il faut utiliser des accolades pour créer un hachage. Les tableaux, quant à eux, se définissent par l’intermédiaire de crochets.

Comme les tableaux, il est tout à fait possible de rajouter par la suite des champs à un hachage:

ami["pays"] = "Belgique"

Quelques définitions: clef et valeur

Comme les hachages n’utilisent pas que des indices numériques, on utilise le mot clef (en anglais: «key») pour les identifier. Un objet représenté à travers une clef est appelé valeur (en anglais: «value»).

Donc, dans l’exemple précédent, «prénom», «nom de famille» et «pays» sont des clefs. Leurs valeurs respectives sont «Jean-Paul», «Goret» et «Belgique».

Hachages et itérateurs

Évidemment, les hachages possèdent des itérateurs. En voici quelques uns:

Hash#each

A l’instar des tableaux, les hachages ont également une méthode each. Cependant, elle nous donne à la fois la clef et la valeur de l’entrée. En voici un exemple:


amis.each do |clef, valeur|
   puts clef + " => " + valeur
end

Et voici son résultat à l’écran:


ville => Houtsiplou
nom de famille => Goret
pays => Belgique
adresse => Rue de l'église, 26
province => Liège
prénom => Jean-Paul

Ceci illustre un des plus gros défauts des hachages. Les données contenues dans un hachage ne sont pas classées dans un ordre particulier. Comment Ruby pourrait-il savoir que «prénom» doit venir avant «adresse»?

Le meilleur moyen de résoudre ce type de problème est de créer sa propre classe. Ruby est excellent pour ça. Mais avant d’étudier cette technique, il y a encore quelques notions que nous devons voir. Le prochain chapitre vous expliquera comment créer vos propres classes et méthodes.

Note : Hash#each_pair est un synonyme de Hash#each

Hash#each_key

Le nom de cette méthode nous dit tout. Elle permet de parcourir toutes les clefs d’un hachage, un peu de la même façon que Hash#each:


>> ami.each_key do |clef|
?>     puts clef
>> end
ville
nom de famille
pays
adresse
province
prénom

Hash#each_value

Cette méthode parcourt toutes les valeurs d’un hachage:


>> ami.each_value do |valeur|
?>     puts valeur
>> end
Houtsiplou
Goret
Belgique
Rue de l'église, 26
Liège
Jean-Paul

Itérateurs << | Apprenez Ruby | >> Exemple pratique: un carnet d’adresses