Contactez-nous

Définition : le Hash et la syntaxe des symboles (:key)

Qu'est-ce qu'un Hash en Ruby ? Apprenez la définition d'un dictionnaire et la syntaxe des Symboles (:key) pour créer des paires clé-valeur. Comprendre les Symboles est la clé pour écrire du code Ruby idiomatique et performant.

Qu'est-ce qu'un Hash (ou dictionnaire) ?

Un Hash, parfois appelé dictionnaire ou tableau associatif dans d'autres langages, est une collection qui stocke des données sous forme de paires clé-valeur. Contrairement à un tableau (Array) qui est une liste ordonnée et indexée par des nombres (0, 1, 2...), un Hash utilise des objets uniques, les clés, pour accéder directement aux valeurs qui leur sont associées.

L'analogie la plus simple est celle d'un vrai dictionnaire : la clé est le 'mot' que vous cherchez, et la valeur est sa 'définition'. L'ordre des mots dans le dictionnaire n'a pas d'importance ; ce qui compte, c'est le lien direct entre un mot et sa définition. Un Hash fonctionne sur le même principe : il est optimisé pour retrouver une valeur très rapidement à partir de sa clé.

En résumé, si un Array est parfait pour une liste de 'choses' où l'ordre compte (les étapes d'une recette, les jours de la semaine), un Hash est idéal pour décrire les 'propriétés' d'un seul objet où chaque donnée a une étiquette claire (le nom, l'âge et la ville d'un utilisateur).

Le concept clé en Ruby : le Symbole (:key)

Avant de créer notre premier Hash, nous devons découvrir un type d'objet fondamental et très courant en Ruby : le Symbole. Un Symbole est une sorte d'étiquette ou d'identifiant, léger et immuable. On le reconnaît facilement car il commence par deux-points (:).

:name
:email_address
:is_admin

Vous vous demandez peut-être : pourquoi ne pas simplement utiliser des chaînes de caractères ("name") ? C'est une excellente question. La différence clé est double :

  • Performance : Pour un Symbole donné (par exemple :name), Ruby ne crée qu'une seule instance de cet objet pour toute la durée de vie du programme. Si vous utilisez :name 1000 fois, c'est toujours le même objet en mémoire. A l'inverse, 1000 utilisations de la chaîne "name" peuvent créer 1000 objets différents, consommant plus de mémoire.
  • Intention : Un Symbole communique une intention claire au développeur. Il ne représente pas une donnée textuelle à manipuler (comme le nom d'un utilisateur), mais un identifiant fixe (comme l'étiquette 'nom' de cette donnée).

Pour ces raisons, les Symboles sont le choix par excellence pour servir de clés dans un Hash. C'est une convention que vous verrez partout dans l'écosystème Ruby.

Comment créer un Hash avec la syntaxe moderne

Maintenant que nous connaissons les Symboles, créer un Hash est très simple. La syntaxe moderne, introduite dans les versions plus récentes de Ruby, ressemble beaucoup au format de données JSON, ce qui la rend très intuitive.

On utilise des accolades {} pour délimiter le Hash. A l'intérieur, chaque paire clé-valeur est définie par nom_de_la_cle: valeur, et les paires sont séparées par des virgules. Notez que lors de l'utilisation de cette syntaxe, les deux-points sont placés après le nom de la clé.

# Création d'un Hash représentant un utilisateur
user = {
  name: "Alice",
  age: 30,
  city: "Paris",
  is_active: true
}

# Création d'un Hash vide
empty_config = {}

Une erreur fréquente ici est de confondre avec l'assignation. Le : dans name: "Alice" n'est pas un opérateur, il fait partie de la syntaxe de définition du Hash. Il crée un Symbole :name et l'associe à la valeur "Alice".

Contexte historique : l'ancienne syntaxe 'hashrocket'

En explorant des projets Ruby plus anciens ou certains tutoriels, vous rencontrerez inévitablement une autre syntaxe pour définir les Hashes, appelée 'hashrocket' (flèche de hash) en raison de l'opérateur =>.

Dans cette syntaxe, la clé (qui est un Symbole explicite avec le : au début) est liée à sa valeur par la flèche. Le code ci-dessous est strictement équivalent au précédent.

# La même définition avec l'ancienne syntaxe
user = {
  :name => "Alice",
  :age => 30,
  :city => "Paris",
  :is_active => true
}
Conseil pro : Aujourd'hui, la bonne pratique est de toujours utiliser la syntaxe moderne (key: value) lorsque vos clés sont des Symboles. Elle est plus concise et plus lisible. Cependant, vous devez être capable de reconnaître la syntaxe 'hashrocket', car elle reste nécessaire si vous utilisez un autre type d'objet comme clé (par exemple, une chaîne de caractères), ce qui est beaucoup plus rare.
# Cas rare où la flèche est encore nécessaire
string_keys = { "first name" => "Bob" }