2010-01-25 14 views
52

In ruby ​​1.9 c'è un modo per definire questo hash con la nuova sintassi?Ruby 1.9 hash con un trattino in una chiave

irb> { a: 2 } 
=> {:a=>2} 

irb> { a-b: 2 } 
SyntaxError: (irb):5: syntax error, unexpected tLABEL 
{ a-b: 2 } 
    ^

con quello vecchio, sta funzionando:

irb> { :"a-b" => 2 } 
=> {:"a-b"=>2} 

risposta

3

È inoltre possibile utilizzare la sintassi seguente

{a: 1, b: 2, 'c-c': 3, d: 4} 
+0

fantastico! +1 per l'aggiornamento con la nuova sintassi ruby, da quale versione è disponibile? 2? 2.1? – makevoid

+0

Non lo so, ho appena provato questa sintassi e ha funzionato :) – Stiig

+1

La nuova sintassi di @makevoid è disponibile dal 2.2: https://github.com/ruby/ruby/blob/v2_2_0/NEWS#language-changes –

64

ci sono alcuni simboli legittime che non possono essere utilizzati con la nuova sintassi. Non riesco a trovare un riferimento, ma sembra che un nome simbolo corrispondente a /^[a-zA-Z_][a-zA-Z_0-9]*[!?]?$/ sia consentito con la nuova sintassi. L'ultimo personaggio potrebbe essere il personaggio speciale "!" o "?".

Per qualsiasi simbolo che non soddisfa queste restrizioni, è necessario utilizzare la sintassi Ruby 1.8, :'my-symbol-name'

+1

che ha un senso; come dovrebbe interpretare l'interprete Ruby, altrimenti? – Trevoke

+22

Ho controllato in 'parse.c' e sembra che con la nuova sintassi il simbolo venga analizzato come token' tLabel'. E il nome corrispondente è più simile a/[a-zA-Z _] [a-zA-Z0-9]/:-) – MBO

+0

@MBO, Punti extra per andare alla fonte. Ho modificato la regex nella mia risposta. Grazie! –

22

È possibile combinare la vecchia e la nuova sintassi:

{a: 1, b: 2, :'c-c' => 3, d: 4} 
25

Per utilizzare trattini con il nuovo sintassi:

<%= link_to "Link", link_path, {data: {something: 'value1', somethingelse: 'value2'}} %> 

Questo genererà:

<a href="/link" data-something='value1' data-somethingelse='value2'>Link</a> 

Questo potrebbe non essere esattamente il tuo caso d'uso particolare, ma ho trovato questo post mentre cercavo di trovare una risposta da solo, così ho pensato di condividere le mie scoperte.

+0

buone notizie per i puristi :) – prusswan

+0

Nice - questo è esattamente quello che stavo cercando di fare, grazie! –

+2

AFAIK, questo è specifico per gli attributi 'data', se si hanno altri attributi con trattini è necessario utilizzare la vecchia sintassi. – lime

Problemi correlati