2012-05-22 64 views
2
class ClosureClass { 
    def printResult[T](f: => T) = { 
    println("choice 1") 
    println(f) 
    } 

    def printResult[T](f: String => T) = { 
    println("choice 2") 
    println(f("HI THERE")) 
    } 
} 

object demo { 
    def main(args: Array[String]) { 
    val cc = new ClosureClass 
    cc.printResult() // call 1 
    cc.printResult("Hi") // call 2 
    } 
} 

我玩上面的代碼,結果顯示了我。我有兩個問題Scala的參數使用功能

1)爲什麼呼叫1和呼叫2進入選擇1?

2)如何傳遞參數,這樣我可以進入選擇2

感謝,

choice 1 
() 
choice 1 
Hi 

回答

7

類型=> T意味着f是個call-by-name參數。這意味着,fT類型的,並且當其被使用(而不是當調用該函數時傳遞到函數表達式將被評估。

類型String => T意味着fFunction[String,T],也就是說,一個功能。從StringT

當你"Hi"呼叫,String作爲參數,斯卡拉認爲,有兩種選擇:printResult

1)=> T:在這種情況下的情況下T會綁定到String,這很好。

2)String => T:這是行不通的,因爲String不是從String到任何東西的函數......它根本不是函數。

你如何解決這個問題取決於你正在做什麼。如果你只是想解決printResult是如何被調用,然後調用與調用它:

val g: (String => String) = (s: String) => s + "***" 
cc.printResult(g) 

它打印:

choice 2 
HI THERE*** 

,因爲你現在正在正確傳遞一個功能g ,從String到一些T。那T這裏是String,因爲函數只是將***添加到傳遞的任何末尾,並返回修改後的字符串。