2016-04-09 14 views
13

Utilizzo di Ruby 2.3:Perché questa chiave stringa in un hash è convertita in un simbolo?

Nell'esempio 1, la chiave di stringa "a" viene convertita automaticamente in un simbolo, mentre con l'esempio 2 rimane una stringa.

Esempio 1

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

Esempio 2

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

ho pensato : era lo stesso come il vecchio stile di hash razzo => sintassi. Cosa sta succedendo? Perché non l'ho mai notato in Rails? È lo HashWithIndifferentAccess che sta oscurando questo?

+0

@Zabba Perché è necessario aggiungere che la versione? Funziona solo nei recenti Rubys. Se l'OP dice che funziona, implica che si tratta di una versione recente. – sawa

+2

L'OP ha menzionato quella versione nella domanda quindi non è appropriato rimuoverla poiché rimuovendola cambierebbe il significato e l'intento della domanda, quindi è solo essere originali qui. – Zabba

+1

Non è una chiave di stringa, è una chiave simbolica. Niente è cambiato. –

risposta

3

È a causa della nuova sintassi hash introdotta con Ruby 1.9. La sintassi con i due punti funziona solo con i tasti dei simboli. Si chiama hash "simbolo per oggetto" ed è solo zucchero sintattico per lo stile più comune di hash. Un altro punto per me, è più vicino alla notazione di oggetti javascript.

Se ho tipi di chiavi miste, preferisco il vecchio stile (sintassi hash-razzo), ma dipende da voi. Mescolare i due stili mi sembra brutto.

+2

Questa non è la sintassi introdotta in Ruby 1.9. – sawa

+0

Non è vicino alla notazione javascript. Javascript non distingue stringhe e simboli. – sawa

+2

@sawa la nuova sintassi è stata introdotta in ruby ​​1.9 ed è più vicina alla notazione javascript. – Reyko

20

In Ruby 2.3 (0,0), questi sono tutti uguali:

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

Tutti traducono alla stessa cosa: a è un simbolo in tutti questi casi.

{"a"=>1} è diverso: a è una stringa in questo caso.

0

Secondo Ruby documentation:

oggetti Blockquote Symbol rappresentano nomi e alcune stringhe all'interno l'interprete Ruby. Vengono generati usando la sintassi: nome e: "stringhe" letterali e dai vari metodi to_sym. [...]

Questo significa che in esecuzione:

$ 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" 

produrrà lo stesso risultato:

$ {:key=>"value"} 
Problemi correlati