Bonjour

J'essaye de comprendre la signification de :nomVariable.
En fait je ne comprends pas pourquoi si j'écris

h = {:a => 12}
b = {:a => 16}

Pourquoi si je tape h:a] j'ai 12 et si je tape b:a] j'ai 16. Moi en lisant la doc je croyais que :a est une sorte d'adresse en mémoire (il parle de :a.object_id avec un id qui ne change pas). Et je pensais donc que h:a] = 16 et b:a] = 16 aussi... mais non

Si j'écris

h = {:a => :a.object_id}
b = {:a => :a.object_id}

Là j'ai bien les mêmes id???

En faites, je crois que je n'ai pas compris la signification et l'utilité de :a ... Si quelqu'un peu m'expliquer?

1 réponse


Salut !

Désolé de la réponse tardive... mais voici une petite explication :

Lorsque tu crée tes variable h et b, tu crée deux instances différentes de la classe Hash.
C'est donc pour cela que tu obtiens bien deux valeurs différentes. Pour plus de facilité, tu peux voir les symboles comme des clés d'accès à un tableau.

Pour la deuxième partie, c'est plus complexe :

:a est un symbole et n'est relié à aucune instance de Hash.

Voici un extrait d'IRB :

developer$ irb
2.1.2 :001 > :a
 => :a # Cet éléméent est global et accessible dans chaque instance de n'importe quelle classes
2.1.2 :002 > :a.object_id
 => 361768 
2.1.2 :003 > A = { :a => :a.object_id } # Le symbole :a est encapsulé dans le Hash tandis que :a.object_id fait appel au :a global
 => {:a=>361768} 
2.1.2 :004 > B = { :a => :a.object_id }
 => {:a=>361768} 
2.1.2 :005 > C = { a: :a.object_id } # Autre notation d'accès aux symboles
 => {:a=>361768}

La différence avec une string est qu'elle n'est pas globale :

2.1.2 :006 > "toto"
 => "toto" 
2.1.2 :007 > "toto".object_id
 => 10024640 
2.1.2 :009 > D = { a: "toto".object_id }
 => {:a=>9831760} 
2.1.2 :010 > E = { a: "toto".object_id }
 => {:a=>9738120}

C'est assez complexe, mais j'espère que cela t'éclairera un petit peu ^^'
Pour le reste la documentation reste un bon moyen de se faire une idée, sinon #IRC !