Existe alguma diferença entre as notações `: key =>“ value ”` e `key:“ value ”` hash?

Existe alguma diferença entre :key => "value" (hashrocket) e key: "value" (Ruby 1.9) notações?

Se não, então eu gostaria de usar a key: "value" notação key: "value" . Existe uma jóia que me ajuda a converter de :x => para x: notações?

Sim, há uma diferença. Estes são legais:

 h = { :$in => array } h = { :'ab' => 'c' } h[:s] = 42 

mas estes não são:

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

Você também pode usar qualquer coisa como uma chave com => para que você possa fazer isso:

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

mas você não pode fazer isso:

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

O estilo JavaScript ( key: value ) só é útil se todas as suas chaves Hash forem símbolos “simples” (mais ou menos algo que corresponda a /\A[a-z_]\w*\z/i , AFAIK o analisador usa seu padrão de etiqueta para essas chaves).

Os símbolos :$in style mostram um bom bocado ao usar o MongoDB, então você acabará misturando estilos Hash se usar o MongoDB. E, se você já trabalhou com chaves específicas de Hashes ( h[:k] ) ao invés de apenas hashes inteiros ( h = { ... } ), você ainda terá que usar o primeiro estilo de dois pontos para símbolos; você também terá que usar o estilo de dois pontos principais para símbolos que você usa fora do Hashes. Eu prefiro ser consistente, então não me incomodo com o estilo JavaScript.

Alguns dos problemas com o estilo JavaScript foram corrigidos no Ruby 2.2. Agora você pode usar aspas se tiver símbolos que não sejam labels válidos, por exemplo:

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

Mas você ainda precisa do hashrocket se suas chaves não são símbolos.

key: "value" é um recurso de conveniência do Ruby 1.9; Contanto que você saiba que o seu ambiente irá suportá-lo, não vejo razão para não usá-lo. É muito mais fácil digitar dois pontos do que um foguete, e acho que parece muito mais limpo. Quanto a haver uma jóia para fazer a conversão, provavelmente não, mas parece uma experiência de aprendizado ideal para você, se você ainda não conhece manipulação de arquivos e expressões regulares.

A key: value As designações no estilo JSON fazem parte da nova syntax de hash do Ruby 1.9, portanto, tenha em mente que essa syntax não funcionará com versões mais antigas do Ruby. Além disso, as chaves serão símbolos. Se você pode viver com essas duas restrições, novos hashes funcionam como os hashes antigos; não há razão (além do estilo, talvez) para convertê-los.

Chaves hash ruby ​​atribuídas por hash-rockets podem facilitar strings para pares de valores-chave ( por exemplo, 's' => x ) enquanto a atribuição de teclas via símbolos ( ex key: "value" ou :key => "value" ) não pode ser atribuído com strings. Embora os hash-foguetes forneçam liberdade e funcionalidade para tabelas de hash, especificamente permitindo strings como chaves , o desempenho do aplicativo pode ser mais lento do que se as tabelas de hash fossem construídas com símbolos como chaves de hash. Os seguintes resources podem esclarecer quaisquer diferenças entre hashrockets e símbolos:

  • Símbolos de Ryan Sobol em Ruby
  • Ruby Hashes Exaplained por Erik Trautman

Fazendo :key => value é o mesmo que fazer key: value , e é realmente apenas uma conveniência. Eu não vi outras linguagens que usam o => , mas outras como o Javascript usam o key: value em seus tipos de dados Hash-equivalentes.

Quanto a uma gema para converter a maneira como você escreveu seus hashes, eu apenas continuaria com a maneira como você está fazendo isso para o seu projeto atual.

* Observe que ao usar a key: value a chave será um símbolo e, para acessar o valor armazenado nessa chave, um hash foo ainda seria foo[:key] .