C'è qualche differenza tra le notazioni hash ": key =>" value "" e "key:" value "?


124

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

In caso contrario, vorrei utilizzare la key: "value"notazione. C'è una gemma che mi aiuta a convertire da :x =>in x:notazioni?

Risposte:


153

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 :$insimboli 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 = { 'a.b': 'c' }è ora legale a partire da Ruby 2.2.0. Vedi bugs.ruby-lang.org/issues/4276
B Seven

@BSeven: Grazie, ho aggiornato la mia altra grande risposta hashrocket qualche tempo fa, ma ho perso questa.
mu è troppo breve

Perché ritieni che l' h[:s] = 42esempio 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:] = 42esempio sembra essere fuorviante.
Nic Nilov

@NicNilov Ciò è rilevante perché lo stile JavaScript riguarda i simboli come chiavi hash e le notazioni consentite dipendono, in modo confuso, dal contesto.
mu è troppo breve il

Non posso essere d'accordo. Quando si indirizza uno slot hash per simbolo, si utilizza sempre la h[:s] = 42notazione. 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.
Nic Nilov

11

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.


5

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:


4

Le key: valueassegnazioni 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.


5
PS: non è in stile JSON, è in stile JavaScript. JSON richiede che le chiavi siano quotate.
mu è troppo breve

1

Fare :key => valueè come fare key: valueed è 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: valuela chiave sarà un simbolo, e per accedere al valore memorizzato in quella chiave in un foohash lo sarebbe comunque foo[:key].


Sia Perl che PHP usano =>. Immagino che Ruby, essendo fortemente ispirato da Perl, abbia preso in prestito la sintassi da Perl :)
Daniel Serodio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.