C’è qualche differenza tra le chiavi `: key =>” value “` e `key:” value “` hash?

C’è qualche differenza tra :key => "value" (hashrocket) e key: "value" (Ruby 1.9) notazioni?

In caso contrario, mi piacerebbe usare la key: "value" notazione key: "value" . C’è un gioiello che mi aiuta a convertire da :x => a x: notazioni?

Sì, c’è differenza. Questi sono legali:

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

ma questi non sono:

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

Puoi anche usare qualsiasi cosa come una chiave con => così puoi farlo:

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

ma non puoi farlo:

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

Lo stile JavaScript ( key: value ) è utile solo se tutte le tue chiavi hash sono simboli “semplici” (più o meno qualcosa che corrisponde a /\A[a-z_]\w*\z/i , AFAIK il parser usa il suo modello di etichetta per queste chiavi).

I simboli :$in stile mostrano un bel po ‘quando usi MongoDB, quindi finirai per mischiare gli stili di hash se usi MongoDB. E, se mai lavori con chiavi specifiche di Hash ( h[:k] ) piuttosto che solo hash completi ( h = { ... } ), dovrai comunque usare lo stile due punti per i simboli; dovrai anche usare lo stile dei due punti iniziali per i simboli che utilizzi al di fuori degli Hash. Preferisco essere coerente, quindi non mi preoccupo affatto dello stile JavaScript.

Alcuni dei problemi con lo stile JavaScript sono stati risolti in Ruby 2.2. Ora puoi utilizzare le virgolette se hai simboli che non sono etichette valide, ad esempio:

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

Ma hai ancora bisogno dell’hashrocket se le tue chiavi non sono simboli.

key: "value" è una caratteristica di convenienza di Ruby 1.9; finché saprai che il tuo ambiente lo sosterrà, non vedo alcun motivo per non usarlo. È molto più facile digitare un colon che un razzo, e penso che sia molto più pulito. Per quanto riguarda la conversione, probabilmente no, ma sembra un’esperienza di apprendimento ideale per te, se non conosci già la manipolazione dei file e le espressioni regolari.

La key: value assegnazioni in stile JSON fanno parte della nuova syntax dell’hash Ruby 1.9, quindi tieni presente che questa syntax non funzionerà con le versioni precedenti di Ruby. Inoltre, i tasti diventeranno simboli. Se riesci a vivere con questi due vincoli, i nuovi hash funzionano come i vecchi hash; non c’è alcuna ragione (diversa dallo stile, forse) per convertirli.

Le chiavi hash ruby assegnate dai razzi hash possono facilitare le stringhe per coppie di valori-chiave ( ad es . 's' => x ) mentre l’assegnazione dei tasti tramite simboli ( ad esempio key: "value" o :key => "value" ) non può essere assegnato con le stringhe. Sebbene i razzi hash offrano libertà e funzionalità per le tabelle hash, in particolare per consentire le stringhe come chiavi , le prestazioni delle applicazioni potrebbero essere più lente rispetto a se le tabelle hash dovessero essere costruite con simboli come chiavi hash. Le seguenti risorse possono essere in grado di chiarire eventuali differenze tra hash e simboli:

  • Simboli di Ryan Sobol in Ruby
  • Ruby Hashes Exaplained di Erik Trautman

Fare :key => value equivale a fare key: value , ed è davvero solo una comodità. Non ho visto altri linguaggi che usano il => , ma altri come Javascript usano la key: value nei loro tipi di dati equivalenti a Hash.

Per quanto riguarda una gem per convertire il modo in cui hai scritto i tuoi hash, vorrei limitarmi al modo in cui lo stai facendo per il tuo progetto attuale.

* Nota che usando la key: value la chiave sarà un simbolo, e per accedere al valore memorizzato in quella chiave in un hash foo sarebbe comunque foo[:key] .