2012-02-17 5 views
7

Mi sono reso conto che le parentesi graffe per un hash possono essere omesse se si tratta dell'ultimo elemento di un array. Per esempio, le forme:Omissione di parentesi graffe per un hash in un array

[1, 2, 3, :a => 'A', :b => 'B'] 
[1, 2, 3, a: 'A', b: 'B'] 

sembrano identici a:

[1, 2, 3, {:a => 'A', :b => 'B'}] 
[1, 2, 3, {a: 'A', b: 'B'}] 

sapevo questo tipo di omissione è possibile per gli argomenti di un metodo, ma non aveva rilevato è possibile per un array . La mia comprensione di questa regola è corretta? E questo è descritto da qualche parte?

+2

Suppongo che in teoria '[...]' sia una chiamata di metodo a un metodo che assomiglia a 'def x (* args)', quindi il comportamento ha un senso. Forse scavare il codice C della gestione letterale dell'array per vedere come viene gestito internamente. –

+3

Non lo userei comunque come pratica di codifica. Preferisco vedere la delimitazione visuale fornita da '{' e '}', e lo dichiarerei in una revisione del codice. È un problema di manutenzione e leggibilità. –

+0

@muistooshort Funziona anche se non è una chiamata al metodo. Questo funziona solo per la creazione di un array. – sawa

risposta

4

Questa sembrerebbe essere una nuova funzionalità di 1.9:

$ rvm use 1.8.7 
$ irb 
ruby-1.8.7-p352 :001 > x = [ 1,2,3,:a => 4, :b => 5 ] 
SyntaxError: compile error 
(irb):1: syntax error, unexpected tASSOC, expecting ']' 
x = [ 1,2,3,:a => 4, :b => 5 ] 
       ^
    from (irb):1 
ruby-1.8.7-p352 :002 > exit 
$ rvm use 1.9.3 
$ irb 
ruby-1.9.3-p0 :001 > x = [ 1,2,3,:a => 4, :b => 5 ] 
=> [1, 2, 3, {:a=>4, :b=>5}] 
ruby-1.9.3-p0 :002 > 
+0

Si noti che i casi in cui la matrice contiene solo hash funzionano in 1.8.x: '' 'ruby 1.8.6-p420: 001> x = [: a => 4,: b => 5] => [ {: a => 4,: b => 5}] '' ' –

-1

Penso che le parentesi (e nessuna parentesi, come di seguito) sono chiamate hash letterali e rubino cerca solo di adattarlo come un elemento di matrice.

>> [1, 2, c: 'd', e: 'f'] # ruby 1.9 hash literals 
=> [1, 2, {:c=>"d", :e=>"f"}] 

Ma non ci sono più regole ad esso, penso che - non si può fare questo:

>> [1, 2, c: 'd', e: 'f', 5] # syntax error, unexpected `]` (waiting for => or :) 
+1

Il tipo che viene restituito non è un hash, ma una matrice, quindi è un letterale di array con un valore letterale di hash incorporato – davetron5000

+0

sì, è vero. speravi in ​​un letterale hash come questo: 'a: b, c: d'? – farnoy

Problemi correlati