2012-02-17 9 views
7

Me di cuenta de que las llaves para un hash se pueden omitir si es el último elemento de una matriz. Por ejemplo, las formas:Omisión de llaves para un hash en una matriz

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

parecen ser idénticos a:

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

sabía que este tipo de omisión es posible que los argumentos de un método, pero no había observado que es posible para una matriz . ¿Mi comprensión de esta regla es correcta? Y, ¿esto está descrito en alguna parte?

+2

Supongo que, en teoría, '[...]' es una llamada a un método que se parece a 'def x (* args)', por lo que el comportamiento tiene algún sentido. Tal vez desenterrar la matriz de manejo literal de código C para ver cómo se maneja internamente. –

+3

No lo usaría como una práctica de codificación. Prefiero ver el delimitado visual provisto por '{' y '}', y lo expresaré en una revisión de código. Es un problema de mantenimiento y legibilidad. –

+0

@muistooshort Funciona incluso si no se trata de una llamada a un método. Esto funciona solo para crear una matriz. – sawa

Respuesta

4

Esta parece ser una característica nueva de 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

Tenga en cuenta que los casos en los que la matriz contiene solo hashes funcionan en 1.8.x: '' 'ruby 1.8.6-p420: 001> x = [: a => 4,: b => 5] => [ {: a => 4,: b => 5}] '' ' –

-1

Creo que los corchetes (y no los corchetes, como a continuación) se llaman literales hash y Ruby solo intenta encajarlo como un elemento de matriz.

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

Pero no hay más reglas a ella, creo que - no se puede hacer esto:

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

El tipo que se devuelve no es un Hash, sino un Array, por lo que es un literal de Array con un literal Hash incrustado – davetron5000

+0

sí, eso es correcto. ¿Estabas esperando un hash literal como este: 'a: b, c: d'? – farnoy

Cuestiones relacionadas