2013-02-28 25 views
1

我是一個scala新手。斯卡拉匿名函數 - 不像我預期的那樣行爲

我想明白爲什麼,因爲我希望它

def invokeFunc(myFunc:() => String){ 
    println(myFunc()) 
    } 

    def callInvoker(){ 
    invokeFunc({ return "this is a string" }) 
    } 

當我調用「callInvoker」我什麼也沒得到這個代碼不行爲。我期待打印「這是一個字符串」,但沒有任何回報。爲什麼?

+0

你有意離開了「=」函數簽名後面? – peri4n 2013-02-28 10:46:29

+0

你能解釋一下這個問題嗎? – 2013-02-28 10:47:13

+1

def functionName(arg:Arg):ReturnType = {Body}是函數的標準定義。你忽略了'=',它告訴編譯器你的函數正在返回Unit(在Java世界中是void)。 – peri4n 2013-02-28 10:49:00

回答

4

這是因爲return不會從匿名函數返回,而是從封閉方法。 因此,在做invokeFunc({ return "this is a string" })時,您實際上從callInvoker(其值爲"this is a string",由於callInvoker的類型爲Unit而被丟棄)有效返回。

一個修正的代碼如下:

def invokeFunc(myFunc:() => String){ 
    println(myFunc()) 
} 

def callInvoker(){ 
    invokeFunc{() => "this is a string" } 
} 

callInvoker() 

現在您的匿名函數實際上返回"this is a string"(任何函數/方法返回其最後的表達,除非遇到一個明確的return,但我解釋return適用於封閉方法,而不是匿名函數)。

+0

非常感謝。一旦網站允許我接受我的答案。 (最短時間限制)。 – 2013-02-28 10:43:14

相關問題