2011-12-30 11 views

risposta

136

Sì, c'è una 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 

È anche possibile utilizzare qualsiasi cosa come una chiave con => in modo da poter fare questo:

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

ma si puo' t fare questo:

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[a-z_]\w*\z/i, AFAIK il parser utilizza il proprio modello di etichetta per queste chiavi).

I simboli di stile :$in mostrano un bel po 'quando si usa MongoDB, quindi finirai a mischiare gli stili di hash se usi MongoDB. Inoltre, se lavori con chiavi Hash specifiche (h[:k]) anziché solo con hash interi (h = { ... }), dovrai comunque utilizzare lo stile del primo carattere 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 possibile utilizzare le virgolette se si dispone di simboli che non sono le etichette valide, ad esempio:

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

ma è ancora necessario il hashrocket se le chiavi non sono simboli.

+0

'h = {'a.b': 'c'}' è ora legale a partire da Ruby 2.2.0. Vedi https://bugs.ruby-lang.org/issues/4276 –

+0

@BSeven: Grazie, ho aggiornato [la mia altra grande risposta hashrocket] (http://stackoverflow.com/a/10004344/479863) da un po 'di tempo fa questo. –

+0

Perché ritieni che l'esempio di 'h [: s] = 42' 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 per chiavi. Quindi l'esempio di 'h [s:] = 42' sembra fuorviante. –

4

Gli incarichi in stile JSON key: value fanno parte della nuova sintassi dell'hash di Ruby 1.9, pertanto tenere presente che questa sintassi 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.

+4

PS: Non è * * JSON-stile, è JavaScript stile. JSON richiede che le chiavi vengano citate. –

10

key: "value" è una funzionalità utile 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.

1

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

Per quanto riguarda una gemma 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 key: value la chiave sarà un simbolo, e per accedere al valore memorizzato su quella chiave in un hash foo sarebbe ancora foo[:key].

+0

Sia Perl che PHP usano '=>'. Immagino che Ruby, essendo fortemente ispirato da Perl, abbia preso in prestito la sintassi di Perl :) –

2

rubino hash tasti assegnati da hash-razzi possono facilitare stringhe di coppie di valori-chiave (es. 's' => x) che l'attribuzione chiave tramite simboli (esempiokey: "value" o :key => "value") non può essere assegnato con stringhe. Sebbene i razzi hash offrano libertà e funzionalità per le tabelle hash, in modo specifico per consentire 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 possono essere in grado di chiarire eventuali differenze tra hashrockets e simboli: