¿Es posible llamar a funciones que están contenidas en un parámetro vararg?¿Cómo llamar funciones desde un parámetro vararg?
def perform(functions:() => Unit*) = ?
¿Es posible llamar a funciones que están contenidas en un parámetro vararg?¿Cómo llamar funciones desde un parámetro vararg?
def perform(functions:() => Unit*) = ?
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.
@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.
En Ruby, llamamos a esto "splatting" los argumentos. –