2013-03-04 28 views
1

比方說,我們做匿名函數中的println在斯卡拉

object Test { 
    def main(args: Array[String]){ 
     println(() => "2pac")  // passing anon function 
     println((() => "shakur")()) // passing anon function, with empty args 
     println(biggie)   // passing named function, no args 
    } 

    def biggie = "smalls" 
} 

,將打印出來

<function> 
shakur 
smalls 

爲什麼匿名函數,與同類型的簽名命名功能,需要明確的空ARGS?爲什麼biggie在打印時被調用,但2pac函數沒有?

回答

11

讓我們一行一行:

println(() => "2pac") 

這裏要傳遞一個函數給println。請記住,在斯卡拉的功能僅僅是一個對象,所以的println只是呼籲Function0類型,它只是始終輸出<function>(其實對我來說,輸出<function0>

println((() => "shakur")()) 

現在要調用的匿名函數toString方法它被傳遞給println之前,所以不是接收Function0對象時,它接收該函數的返回值,並只輸出該串

println(biggie) 

最後,這裏biggie不僅僅是Function0,它是一個nopelary函數,意思是函數在被引用時執行,並且不明確要求調用()。這是因爲您沒有參數列表而是定義它,而不是空的參數列表。所以,當你調用println(biggie),該biggie功能進行評估,如果你打電話println(biggie _)其結果發送到println

,下劃線告訴編譯器評價功能,而是它傳遞函數本身println。同樣,如果你定義biggie爲:

def biggie() = "smalls" 

當你調用println(biggie)它則表現與傳遞一個0-ARG匿名函數。

+0

謝謝,這清除了事情! – TranquilMarmot 2013-03-04 22:31:49

+0

+1。很好的詳細。但是你應該用「空方法」來代替「空功能」。 「方法」和「功能」的概念通常可以互換使用,區別通常並不重要,但在這裏它確實:即使(空)參數列表丟失,也不會自動應用空函數,而一個空方法將會(如果在預計除函數以外的某種類型的情況下使用)。 Plus方法區分nullary方法和no-arg方法,而函數只能是nullary(無參數函數不存在於scala中)。 – 2013-03-05 00:39:41

+0

'def's不是函數,它們是方法。 – pedrofurla 2013-03-05 01:57:38