web-dev-qa-db-fra.com

Pourquoi cette clé de chaîne dans un hachage est-elle convertie en symbole?

Utilisation de Ruby 2.3:

Dans l'exemple 1, la clé de chaîne "a" est automatiquement converti en symbole, alors qu'avec l'exemple 2, il reste une chaîne.

Exemple 1

{"a": 1}
# => {:a=>1} 

Exemple 2

{"a"=>"c"}
# => {"a"=>"c"}

J'ai pensé : était la même que la fusée de hachage à l'ancienne => syntaxe. Que se passe-t-il? Pourquoi n'ai-je jamais remarqué cela dans Rails? Est-ce le HashWithIndifferentAccess qui obscurcit cela?

33
Nona

En Ruby 2.3 (.0), ce sont tous les mêmes:

{:"a" => 1}
{"a": 1},
{:a => 1}
{a: 1} 

Ils se traduisent tous par la même chose: a est un symbole dans tous ces cas.

{"a"=>1} est différent: a est une chaîne dans ce cas.

38
Zabba

C'est à cause de la nouvelle syntaxe de hachage introduite avec Ruby 1.9. La syntaxe avec deux points fonctionne uniquement avec les touches de symbole. Elle s'appelle un hachage "symbole pour objecter" et ce n'est que du sucre syntaxique pour le style le plus courant de hachage là-bas. Un autre point pour moi, c'est plus proche de la notation d'objet javascript.

Si j'ai des types de touches mixtes, je préfère l'ancien style (syntaxe de hachage-fusée), mais cela dépend de vous. Mélanger les deux styles me semble moche.

6
guitarman

Selon documentation Ruby :

Les objets Symbol Blockquote représentent des noms et des chaînes à l'intérieur de l'interpréteur Ruby. Ils sont générés à l'aide de la syntaxe des littéraux: name et: "string", et par les différentes méthodes to_sym. [...]

Cela signifie que l'exécution:

$ Ruby -e Ruby -e "h = {key: \"value\"}; puts h"
$ Ruby -e Ruby -e "h = {:key => \"value\"}; puts h"
$ Ruby -e Ruby -e "h = {\"key\": \"value\"}; puts h"
$ Ruby -e Ruby -e "h = {:\"key\" => \"value\"}; puts h"
$ Ruby -e Ruby -e "h = {\"#{:key}\": \"value\"}; puts h"

Produira le même résultat:

$ {:key=>"value"}
1
Renato Damas