2009-11-13 87 views
36

la línearubí: lo que hace el asterisco en "p * 1..10" significa

p *1..10 

hace exactamente lo mismo que

(1..10).each { |x| puts x } 

que le da el siguiente resultado:

$ ruby -e "p *1..10" 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

es un gran atajo al trabajar con el compañero de texto por ejemplo, pero ¿qué hace el asterisco? ¿Cómo funciona? no pudo encontrar nada en la red ...

Respuesta

60

Es el splat operator. A menudo verá que solía dividir una matriz en parámetros para una función.

def my_function(param1, param2, param3) 
    param1 + param2 + param3 
end 

my_values = [2, 3, 5] 

my_function(*my_values) # returns 10 

Más comúnmente se utiliza para aceptar un número arbitrario de argumentos

def my_other_function(to_add, *other_args) 
    other_args.map { |arg| arg + to_add } 
end 

my_other_function(1, 6, 7, 8) # returns [7, 8, 9] 

También funciona para la asignación múltiple (aunque ambas afirmaciones funcionará sin el splat):

first, second, third = *my_values 
*my_new_array = 7, 11, 13 

Para su ejemplo, estos dos serían equivalentes:

p *1..10 
p 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
+1

me parece que a, b, c = * myvalues ​​ es equivalente a a, b, c = myvalues ​​ o Ruby usa implícitamente el operador splat en este caso? –

+0

@Patrick Sí, la asignación donde hay un objeto en un lado y múltiples objetos en el otro implicará un operador de splat. Entonces ese no es un ejemplo muy útil, supongo. – Neall

Cuestiones relacionadas