2014-10-20 18 views
0

我的方法(函數)列表,輸出Unit規範的方式來定義和執行輸出單位的方法?

var fns:List[() => Unit] = Nil 
def add(fn:() => Unit) = fns :+= fn  // a method to add to the list 

我想補充println("hello")到列表中。

add(() => println("hello")) 

有沒有比使用醜陋圓括號更好的方法。

我寧願:

add (println("hello")) // error here 

def myCoolMethod = { 
    // do something cool 
    // may return something, not necessarily Unit 
} 
add (myCoolMethod) // error here 

我試圖var fns:List[_ => Unit]var fns:List[Any => Unit]fns:List[() => Any]等沒有得到我想要的東西。

第二個問題是當我想如何執行列表中的方法。我得到它的工作:

fns foreach (_.apply) 

有沒有更好的方法?

回答

4

你可以使用by-name參數,而不是空的參數列表功能是這樣的:

var fns:List[() => Unit] = Nil 
def add(fn: => Unit) = fns :+= (fn _) 

add{ print("hello ") } 

def myCoolMethod = { println("world") } 
add(myCoolMethod) 

fns foreach {_.apply} 
// hello world 

你可以使用_()代替_.applyfns foreach {_()},但我更喜歡_.apply

+0

我們可以有一個'add'接受方法的Seq'而不是一個方法嗎?所以我可以添加(Seq(println(「hello」),myCoolMethod))'。 – Jus12 2014-10-20 07:38:31

+1

@ Jus12:不,你不能在沒有宏的情況下得到重複的名字參數。 – senia 2014-10-20 08:00:05

相關問題