2011-09-26 9 views
8

Estoy tratando de entender la diferencia entre *(1..9) y [*1..9]splat rubí entendimiento en rangos y matrices

Si les asigno a las variables que funcionan de la misma manera

splat1 = *(1..9) # splat1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
splat2 = [*1..9] # splat2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

Pero las cosas se ponen extrañas cuando intente utilizar *(1..9) y [*1..9] directamente.

*(1..9).map{|a| a.to_s} # syntax error, unexpected '\n', expecting tCOLON2 or '[' or '.' 
[*1..9].map{|a| a.to_s} # ["1", "2", "3"...] 

Supongo que parte del problema es con la precidencia del operador? Pero no estoy exactamente seguro de lo que está pasando. ¿Por qué no puedo usar *(1..9) de la misma manera que puedo usar [*1..9]?

+1

'p * (1..9) .map {| a | a.to_s} 'funciona bien – Bohdan

+0

De forma similar,' ([* 1..9]). map' debería funcionar bien; sin embargo, creo que el método explícito 'to_a' es más claro y esencialmente igual de conciso. – maerics

Respuesta

8

Creo que el problema es que splat solo se puede usar como un lvalue, es decir, tiene que ser recibido por algo.

Por lo tanto, su ejemplo de *(1..9).map falla porque no hay destinatario en el splat, pero el [*1..9].map funciona porque la matriz que está creando es el destinatario del splat.

ACTUALIZACIÓN: Algunos más información sobre este tema (especialmente el último comentario): Where is it legal to use ruby splat operator?