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

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

De lo contrario, me gustaría usar la key: "value" notación de key: "value" . ¿Hay alguna gem que me ayude a convertir de :x => a x: notaciones?

Sí, hay una diferencia. Estos son legales:

 h = { :$in => array } h = { :'ab' => '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 una clave con => para que pueda 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 de JavaScript ( key: value ) solo es útil si todas las teclas Hash son símbolos “simples” (más o menos algo que coincide con /\A[a-z_]\w*\z/i , AFAIK el analizador usa su patrón de etiqueta para estas teclas).

Los símbolos :$in estilo aparecen un poco cuando se usa MongoDB, por lo que terminará mezclando estilos Hash si usa MongoDB. Y, si alguna vez trabaja con claves específicas de Hashes ( h[:k] ) en lugar de hashes completos ( h = { ... } ), igual tendrá que usar el estilo de dos puntos para los símbolos; también deberá usar el estilo de punto inicial para los símbolos que use fuera de Hashes. Prefiero ser coherente, así que no me molesto en absoluto con el estilo de JavaScript.

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

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

Pero aún necesitas el hashrocket si tus llaves no son símbolos.

key: "value" es una función de conveniencia de Ruby 1.9; siempre que sepa que su entorno lo apoyará, 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 gem 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.

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

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

  • Símbolos de Ryan Sobol en Ruby
  • Ruby Hashes explicado por Erik Trautman

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

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

* Tenga en cuenta que al usar la key: value la clave será un símbolo, y para acceder al valor almacenado en esa tecla en un foo hash, seguirá siendo foo[:key] .