simbolo que into elemento declarar create contadores como arreglo agregar ruby string hash symbols literals

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