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 !