Risposte:
Sì, c'è differenza. Questi sono legali:
h = { :$in => array }
h = { :'a.b' => '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 chiave con =>
così puoi fare questo:
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 chiavi hash sono simboli "semplici" (più o meno qualcosa che corrisponde /\A[a-z_]\w*\z/i
, AFAIK il parser usa il suo modello di etichetta per queste chiavi).
I :$in
simboli di stile vengono visualizzati un bel po 'quando si utilizza MongoDB, quindi finirai per mescolare gli stili hash se usi MongoDB. E, se mai lavorassi con chiavi specifiche di hash ( h[:k]
) piuttosto che solo hash interi (h = { ... }
), dovrai comunque usare lo stile dei due punti per i simboli; dovrai anche usare lo stile dei due punti iniziali per i simboli che usi 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 usare 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.
h[:s] = 42
esempio si riferisca a questa domanda? A mio parere, lo stile JavaScript rispetto allo stile hashrocket è rilevante solo per la definizione della coppia chiave / valore hash e non per indirizzare gli elementi hash tramite chiavi. Pertanto l' h[s:] = 42
esempio sembra essere fuorviante.
h[:s] = 42
notazione. Non c'è altra opzione. È quando definisci le coppie chiave / valore che hai le opzioni di { key: value }
stile JavaScript o { :key => value }
stile hashrocket. Lo scenario di indirizzamento sembra ancora non essere rilevante per ciò che è a fuoco.
key: "value"
è una caratteristica comoda di Ruby 1.9; fintanto che sai che il tuo ambiente lo supporterà, non vedo alcun motivo per non usarlo. È solo molto più facile digitare i due punti che un razzo e penso che sembri molto più pulito. Per quanto riguarda il fatto che ci sia un gioiello per fare 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.
Rubino hash tasti assegnati da hash-razzi possono facilitare stringhe di coppie di valori-chiave ( es . 's' => x
), Mentre assegnazione dei tasti tramite simboli ( es key: "value"
o :key => "value"
) non può essere assegnata con stringhe. Sebbene gli hash-rocket forniscano libertà e funzionalità per le tabelle hash, consentendo in particolare le stringhe come chiavi , le prestazioni dell'applicazione potrebbero essere più lente rispetto a se le tabelle hash dovessero essere costruite con simboli come chiavi hash. Le seguenti risorse potrebbero essere in grado di chiarire eventuali differenze tra hashrocket e simboli:
Le key: value
assegnazioni in stile JSON fanno parte della nuova sintassi hash di Ruby 1.9, quindi tieni presente che questa sintassi non funzionerà con le versioni precedenti di Ruby. Inoltre, le chiavi saranno simboli. Se riesci a convivere con questi due vincoli, i nuovi hash funzionano proprio come i vecchi hash; non c'è motivo (a parte lo stile, forse) per convertirli.
Fare :key => value
è come fare key: value
ed è davvero solo una comodità. Non ho visto altre lingue che usano il =>
, ma altri come Javascript usano ilkey: value
nei loro tipi di dati equivalenti all'hash.
Per quanto riguarda una gemma per convertire il modo in cui hai scritto i tuoi hash, mi limiterò al modo in cui lo stai facendo per il tuo progetto attuale.
* Nota che nell'usare key: value
la chiave sarà un simbolo, e per accedere al valore memorizzato in quella chiave in un foo
hash lo sarebbe comunque foo[:key]
.
=>
. Immagino che Ruby, essendo fortemente ispirato da Perl, abbia preso in prestito la sintassi da Perl :)
h = { 'a.b': 'c' }
è ora legale a partire da Ruby 2.2.0. Vedi bugs.ruby-lang.org/issues/4276