Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Ruby est un peu paresseux

| Comments

Niveau : intermédiaire

Voici un mécanisme interne du langage Ruby démontré le temps d’une petite session irb.

D’abord, créons la variable a, qui va contenir la chaîne "one" :

1
2
3
$ irb
>> a = "one"
"one"

Créons ensuite la variable b, qui va contenir ce que contient la variable a, c’est à dire aussi "one" :

1
2
>> b = a
"one"

Question : est ce que les variables a et b partagent le même emplacement en mémoire ?

Et bien oui, b = a n’a pas copié la valeur de a dans b, mais a assigné à b la même case mémoire que a :

1
2
3
4
5
6
>> a.object_id == b.object_id
true
>> a.object_id
81895060
>> b.object_id
81895060

Mais alors si on change la valeur de la variable a, ça va changer aussi celle de b ? Et non :

1
2
3
4
5
6
>> a = "two"
"two"
>> a.object_id == b.object_id
false
>> b
"one"

L’emplacement mémoire a été modifié. On a maintenant deux variables bien distinctes :

1
2
3
4
>> a.object_id
81648680
>> b.object_id
81895060

Tant qu’il n’y a pas de modification de l’une ou de l’autre des variables, Ruby agit en quelque sorte comme si il n’y en avait qu’une seule. J’imagine que c’est pour soulager l’utilisation de la mémoire.

Mais dès que l’une ou l’autre est modifiée, les deux variables deviennent bien distinctes.

1
>> exit

Articles connexes

Commentaires