2011-06-15 96 views

回答

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 

編碼愉快。

2

@pst給了你答案,我只是再添加一點點以備將來參考。

比方說,你發現自己的功能如下集合:

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

如果試圖在REPL

perform(fcts) // this does not compile 

將無法​​正常工作執行此。

但是你可以告訴編譯器,你真正想實現的是通過列表作爲Java數組(這是可變參數是如何在字節碼錶示)

perform(fcts : _*) // works. 

顯然,這種擱置任何Scala集合,而不僅僅是List。

+0

在Ruby中,我們稱之爲「splatting」參數。 – 2011-08-26 16:11:01