2010-04-17 33 views
7

比方說,我想使沿線的一個小包裝:如何將任何函數作爲Scala包裝器方法的輸入?

def wrapper(f: (Any) => Any): Any = { 
    println("Executing now") 
    val res = f 
    println("Execution finished") 
    res 
} 

wrapper { 
    println("2") 
} 

這是否有道理?我的包裝方法顯然是錯誤的,但我認爲我想要做的事情的精神是可能的。我是這麼想的嗎?如果是這樣,解決方案是什麼?謝謝!

回答

21

如果你希望你的wrapper方法來執行的包裹方法在它本身內部,你應該改變參數爲「按名稱」。這使用語法=> ResultType

def wrapper(f: => Any): Any = { 
    println("Executing now") 
    val res = f 
    println("Execution finished") 
    res 
} 

現在可以做到這一點,

wrapper { 
    println("2") 
} 

,它將打印

Executing now 
2 
Execution finished 

如果你希望能夠使用包裝的函數的返回類型,可以使你的方法通用:

def wrapper[T](f: => T): T = { 
    println("Executing now") 
    val res: T = f 
    println("Execution finished") 
    res 
} 
+0

謝謝,這工作像一個魅力。 – pr1001 2010-04-17 18:47:29

1

在你的情況下,你已經在執行函數println,然後將結果傳遞給你的包裝,而它期望一個函數帶有一個參數(Any)並返回Any

不知道這是否回答你的問題,但你可以使用一個通用的類型參數,並接受無參數返回該類型的函數:

def wrapper[T](f:() => T) = { 
    println("Executing now") 
    val res = f() // call the function 
    println("Execution finished") 
    res 
} 

wrapper { 
()=>println("2") // create an anonymous function that will be called 
} 
相關問題