是否可以调用vararg-parameter中包含的函数?
def perform(functions:() => Unit*) = ?
答案 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。