¿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?
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 :$in
sí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.
h = { 'a.b': 'c' }
ahora es legal a partir de Ruby 2.2.0. Ver bugs.ruby-lang.org/issues/4276h[:s] = 42
ejemplo 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, elh[s:] = 42
ejemplo parece ser engañoso.h[:s] = 42
notació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.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.fuente
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:fuente
Las
key: value
asignaciones 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.fuente
Hacer
:key => value
es lo mismo que hacerkey: value
, y realmente es solo una conveniencia. No he visto otros idiomas que usan el=>
, pero otros como Javascript usan elkey: value
en 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: value
la clave será un símbolo, y para acceder al valor almacenado en esa clave en unfoo
hash aún lo seríafoo[:key]
.fuente
=>
. Supongo que Ruby, estando fuertemente inspirado por Perl, tomó prestada la sintaxis de Perl :)