¿Hay alguna diferencia entre las anotaciones hash `: key =>“ value ”` y `key:“ value ”`?

124

¿Hay alguna diferencia entre las :key => "value"anotaciones (hashrocket) y key: "value"(Ruby 1.9)?

Si no, me gustaría usar la key: "value"notación. ¿Hay una joya que me ayuda a convertir de :x =>a x:notaciones?

AdamNYC
fuente

Respuestas:

153

Sí, hay una diferencia. Estos son legales:

h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42

pero estos no son:

h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42

También puede usar cualquier cosa como clave =>para poder hacer esto:

h = { C.new => 11 }
h = { 23 => 'pancakes house?' }

pero no puedes hacer esto:

h = { C.new: 11 }
h = { 23: 'pancakes house?' }

El estilo JavaScript ( key: value) solo es útil si todas sus teclas Hash son símbolos "simples" (más o menos algo que coincida /\A[a-z_]\w*\z/i, AFAIK el analizador utiliza su patrón de etiqueta para estas teclas).

Los :$insímbolos de estilo se muestran bastante cuando usas MongoDB, por lo que terminarás mezclando estilos Hash si usas MongoDB. Y, si alguna vez trabaja con teclas específicas de Hashes ( h[:k]) en lugar de solo hashes enteros ( h = { ... }), aún tendrá que usar el estilo de dos puntos para los símbolos; También deberá usar el estilo de dos puntos principales para los símbolos que use fuera de Hashes. Prefiero ser coherente para no molestarme en absoluto con el estilo JavaScript.

Algunos de los problemas con el estilo JavaScript se han solucionado en Ruby 2.2. Ahora puede usar comillas si tiene símbolos que no son etiquetas válidas, por ejemplo:

h = { 'where is': 'pancakes house?', '$set': { a: 11 } }

Pero aún necesita el hashrocket si sus claves no son símbolos.

mu es demasiado corto
fuente
h = { 'a.b': 'c' }ahora es legal a partir de Ruby 2.2.0. Ver bugs.ruby-lang.org/issues/4276
B Seven
@BSeven: Gracias, actualicé mi otra gran respuesta de hashrocket hace un tiempo, pero me perdí esta.
mu es demasiado corto
¿Por qué sientes que el h[:s] = 42ejemplo se relaciona con esta pregunta? En mi opinión, el estilo JavaScript versus el estilo hashrocket solo es relevante para la definición de pares clave / valor hash, y no para abordar elementos hash mediante claves. Por lo tanto, el h[s:] = 42ejemplo parece ser engañoso.
Nic Nilov
@NicNilov Eso es relevante porque el estilo JavaScript se trata de símbolos como las teclas Hash y las notaciones permitidas son, confusamente, dependientes del contexto.
mu es demasiado corto
No puedo estar de acuerdo. Al direccionar una ranura hash por símbolo, siempre usa h[:s] = 42notación. No hay otra opción. Es cuando define pares clave / valor que tiene opciones de { key: value }estilo JavaScript o { :key => value }estilo hashrocket. El escenario de direccionamiento aún parece no ser relevante para lo que está en foco.
Nic Nilov
11

key: "value"es una característica de conveniencia de Ruby 1.9; Mientras sepa que su entorno lo admitirá, no veo ninguna razón para no usarlo. Es mucho más fácil escribir un colon que un cohete, y creo que se ve mucho más limpio. En cuanto a que haya una gema para hacer la conversión, probablemente no, pero parece una experiencia de aprendizaje ideal para ti, si aún no conoces la manipulación de archivos y las expresiones regulares.

rangos unidos
fuente
5

Las claves hash de Ruby asignadas por los cohetes hash pueden facilitar las cadenas para los pares clave-valor ( p . Ej . 's' => x), Mientras que la asignación de teclas mediante símbolos ( p . Ej.key: "value" O :key => "value") no puede asignarse con cadenas. Aunque los hash-cohetes proporcionan libertad y funcionalidad para las tablas hash, específicamente permitiendo cadenas como claves , el rendimiento de la aplicación puede ser más lento que si las tablas hash fueran construidas con símbolos como claves hash. Los siguientes recursos pueden aclarar cualquier diferencia entre hashrockets y símbolos:

alexanderjsingleton
fuente
4

Las key: valueasignaciones de estilo JSON son parte de la nueva sintaxis hash Ruby 1.9, así que tenga en cuenta que esta sintaxis no funcionará con versiones anteriores de Ruby. Además, las teclas serán símbolos. Si puede vivir con esas dos restricciones, los nuevos hashes funcionan igual que los antiguos; no hay razón (aparte del estilo, tal vez) para convertirlos.

sczizzo
fuente
55
PD: no es estilo JSON, es estilo JavaScript. JSON requiere que se citen las claves.
mu es demasiado corto el
1

Hacer :key => valuees lo mismo que hacer key: value, y realmente es solo una conveniencia. No he visto otros idiomas que usan el =>, pero otros como Javascript usan el key: valueen sus tipos de datos equivalentes a Hash.

En cuanto a una gema para convertir la forma en que escribiste tus hash, simplemente me quedaría con la forma en que lo haces para tu proyecto actual.

* Tenga en cuenta que al usar key: valuela clave será un símbolo, y para acceder al valor almacenado en esa clave en un foohash aún lo sería foo[:key].

Charles
fuente
Tanto Perl como PHP usan =>. Supongo que Ruby, estando fuertemente inspirado por Perl, tomó prestada la sintaxis de Perl :)
Daniel Serodio