2011-06-15 18 views

Respuesta

11

Sí, es muy posible:

>> def perform(functions:() => Unit*) = for (f <- functions) f() 
>> perform(() => println("hi"),() => println("bye"))  
hi 
bye 
perform: (functions:() => Unit*)Unit 

recordar que los parámetros repetidos se exponen como Seq[TheType]. En este caso, Seq[() => Unit], aunque puede ser un poco confuso, ya que parece como el * debe tener una mayor precedencia, pero no es así.

Tenga en cuenta que el uso de paréntesis produce el mismo tipo:

>> def perform(functions:(() => Unit)*) = for (f <- functions) f() 
perform: (functions:() => Unit*)Unit 

feliz de codificación.

2

@pst le dio la respuesta, solo estoy agregando otro bit para referencia futura.

Digamos que usted se encuentra con el siguiente conjunto de funciones:

val fcts = List(() => println("I hate"),() => println("this")) 

Si intenta ejecutar esto en el REPL

perform(fcts) // this does not compile 

no va a funcionar.

Sin embargo, puede decirle al compilador que lo que realmente están tratando de lograr es hacer pasar la lista como una matriz de Java (así es como varargs están representados en el código de bytes)

perform(fcts : _*) // works. 

Claramente, esta bodega de cualquier colección Scala, no solo List.

+0

En Ruby, llamamos a esto "splatting" los argumentos. –

Cuestiones relacionadas