que - ruby create hash
¿Por qué esta clave de cadena en un hash se convierte en un símbolo? (3)
Usando Ruby 2.3:
En el ejemplo 1, la clave de cadena "a"
se convierte automáticamente en un símbolo, mientras que con el ejemplo 2, se mantiene como una cadena.
Ejemplo 1
{"a": 1}
# => {:a=>1}
Ejemplo 2
{"a"=>"c"}
# => {"a"=>"c"}
Pensé :
era lo mismo que el estilo antiguo hash rocket =>
sintaxis. Que esta pasando? ¿Por qué nunca he notado esto en Rails? ¿Es el HashWithIndifferentAccess
que está ocultando esto?
En Ruby 2.3 (.0), todos son iguales:
{:"a" => 1}
{"a": 1},
{:a => 1}
{a: 1}
Todos se traducen a lo mismo: a
es un símbolo en todos estos casos.
{"a"=>1}
es diferente: a
es una cadena en este caso.
Es debido a la nueva sintaxis hash introducida con ruby 1.9. La sintaxis con dos puntos funciona solo con teclas de símbolo. Se denomina hash de "símbolo a objeto" y es solo azúcar sintáctica para el estilo más común de hashes que existe. Otro punto para mí, es más cercano a la notación de objetos javascript.
Si he mezclado tipos de clave, entonces prefiero el estilo antiguo (sintaxis hash-rocket), pero eso depende de usted. Mezclar los dos estilos me parece feo.
Según la documentación de Ruby :
Los objetos de Blockquote Symbol representan nombres y algunas cadenas dentro del intérprete de Ruby. Se generan utilizando la sintaxis de los literales:: nombre y: "cadena", y mediante los diversos métodos to_sym. [...]
Esto significa que corriendo:
$ 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"
Producirá el mismo resultado:
$ {:key=>"value"}