2010-10-27 13 views

Respuesta

12

Se llama splat operator.

splatting un lValue

Un máximo de un lvalue puede splatted en cuyo caso se le asigna una matriz que consiste en los rvalues ​​restantes que carecen de lvalues ​​correspondientes. Si el valor l derecho está salpicado, consume todos los valores r que aún no se han emparejado con lvalues. Si un lvalue splatted va seguido de otros lvalues, consume tantos valores como sea posible sin dejar de permitir que los siguientes lvalues ​​reciban sus valores r.

*a = 1 
a #=> [1] 

a, *b = 1, 2, 3, 4 
a #=> 1 
b #=> [2, 3, 4] 

a, *b, c = 1, 2, 3, 4 
a #=> 1 
b #=> [2, 3] 
C#=> 4 

Splat vacío

Un lvalue puede consistir en un único asterisco (U + 002A) sin ningún identificador asociado. Se comporta como se describió anteriormente, pero en lugar de asignar los valores r correspondientes al valor l splatted, los descarta.

a, *, b = *(1..5) 
a #=> 1 
b #=> 5 

splatting un RValue

Cuando un rvalue se splatted se convierte en una matriz con Kernel.Array(), los elementos de los cuales se convierten en rvalues ​​en su propio derecho.

a, b = *1 
a #=> 1 
b #=> nil 

a, b = *[1, 2] 
a #=> 1 
b #=> 2 

a, b, c = *(1..2), 3 
a #=> 1 
b #=> 2 
C#=> 3 
+2

Además de asignar valores, también puede usar el operador splat para definir métodos: 'def do_it (arg1, * args)'. Ahora puede llamar a 'do_it (1, 2)' y 'do_it (1, 2, 3, 4)'. – Ariejan

0

El operador splat amplía la gama en una matriz.

+0

En algunos casos *, esto es cierto. :) –

0

Eh, hecho de la diversión. Al hacer esto:

*(0..50) 

aparece un error.

El operador splat, en este caso, requiere un receptor para poder trabajar. Así que no te engañes pensando que está roto en irb simplemente intentándolo sin un receptor.

Cuestiones relacionadas