如何从vararg参数调用函数?

时间:2011-06-15 19:59:17

标签: scala

是否可以调用vararg-parameter中包含的函数?

def perform(functions:() => Unit*) = ?

2 个答案:

答案 0 :(得分:11)

是的,非常可能:

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

请记住,重复的参数公开为Seq[TheType]。在这种情况下,Seq[() => Unit],虽然它可能有点令人困惑,因为看起来就像*应该具有更高的优先级,但事实并非如此。

请注意,使用括号会产生相同的类型:

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

快乐的编码。

答案 1 :(得分:2)

@pst给了你答案,我只是添加了一点以供将来参考。

假设您发现自己拥有以下功能集合:

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

如果您尝试在REPL中执行此操作

perform(fcts) // this does not compile

不起作用。

但是你可以告诉编译器你真正想要实现的是将列表作为Java数组传递(这就是字节码中表示varargs的方式)

perform(fcts : _*) // works.

显然,这适用于任何Scala集合,而不仅仅是List。