2012-09-25 25 views
-3

可能重複:
Return in Scala斯卡拉 - 隱含的返回值語法

我一直在使用Scala的剛剛開始,所遇到的一些問題,我真的不明白,和我希望stackoverflow社區能夠說明一些事情。

使用此測試:

example(1,List(1)) 

此代碼的工作,因爲我所期望的 - 在第二次迭代則返回0:

def example(value: Int, list: List[Int]): Int = { 
    if (list.isEmpty) 
    return 0 
    else 
    return 1 
    example(value - list.head, list.tail) + example(value, list.tail); 
} 

但是,此代碼不 - 它拋出一個NoSuchElementException( 「空頭清單」)第二次迭代:

def example(value: Int, list: List[Int]): Int = { 
    if (list.isEmpty) 
    0 
    else 
    1 
    example(value - list.head, list.tail) + example(value, list.tail); 
} 

差異似乎是t在第二個例子中,Scala假定「0」和「1」不是返回值,而是要評估的表達式,因爲在函數結尾處有另一個表達式。由於顯式的「返回」關鍵字,第一個示例將按預期返回,這是有道理的。

但是,考慮到第二個例子中if語句的語法,我會認爲編譯器會意識到「0」不是要評估的表達式,而是一個返回值。爲什麼不是這種情況?

+2

這個確切的問題被問到今天早些時候:http://stackoverflow.com/questions/12560463/return-in-scala – dhg

回答

0

您應該閱讀答案here以獲取有關隱式返回的信息,因爲您的問題的部分是完全重複的。

但我會專門回答你關於「我認爲編譯器會意識到」0「不是要評估的表達式,而是返回值」的觀點,因爲這是一個有趣的觀察。

簡單的答案是0一個表達式......它恰好就是這種情況,它的評估很簡單。在決定如何處理代碼時,Scala不會區分「需要努力的表達式」和「容易的表達式」。它只是按照它的方式處理它。

更重要的是,如果斯卡拉編譯器確實進入猜測你的意圖的業務,那將變得非常瘋狂,並且會使編碼更具挑戰性!

要明白爲什麼我們不希望這,讓我們來看看你的代碼,您發佈的評論:

def example(value: Int, list: List[Int]): Int = { 
    if (list.isEmpty) 
    0 
    else 
    1 
    example(value - list.head, list.tail) + example(value, list.tail); 
} 

正如你提到的,01位是不是真的做任何事情。所以也許這個假設的編譯器會說:「嘿!我可以用這些做的唯一有趣的事情就是回報他們!」並因此使他們迴歸。我們現在會得到一個雙方都會返回的if/else。換句話說,如果list是空的,我們返回,如果它是不是空,我們返回。所以我們總是返回,並且函數結束。

但是等一下!! if/else表達式後面還有另一行!所以我們假設的編譯器會說:「嘿!如果我回到這裏,那麼我永遠不會執行那條線!那條線看起來很重要,也許我不應該返回,以便我可以執行它。但後來它意識到:「哦,不,如果我不歸還01,那麼他們是毫無意義的!我必須歸還它們!」。 「但最後一行還在!」。 「Ahhhhhhh !!!! 1 !!」。

所以也許編譯器不會試圖猜測我們想要的,而只是做我們所說的。

+3

當編譯器或解釋器*試圖猜測*真的[壞事情開心](https:// www.destroyallsoftware.com/talks/wat)。 –

+0

@ om-nom-nom,我可以給你代表你的評論中的鏈接代表。 :-) :-) – dhg