2011-08-10 19 views
1
def list = List(1,2,3,4).map(1+_).reverse.foreach((i:Int)=> println(i)) 

編譯正確,但不會在屏幕上打印任何內容。這是我的一個拼寫錯誤,但我驚訝於它編譯的。斯卡拉奇怪的功能與foreach。預期的行爲與否?

def list = List(1,2,3,4).map(1+_).reverse.foreach((i:Int)=> println(i)) 
    println("--") 
    list 

顯示輸出

-- 
    5 
    4 
    3 
    2 

所以列表已經成爲在這種情況下的功能?這就是我通過輸出推斷的結果,它不是我所期望的

+0

女士們,先生們,我們這裏有一個很好的例子,爲什麼你應該考慮寫下類型,儘管它們可以被推斷出來。 – Raphael

回答

3

是的,list實際上是一種不帶參數的方法。這個定義與簡單地將其設置爲val的關鍵區別在於每次使用時都會對其進行評估,所以每次參考list時,都會打印輸出。

正如以下注釋中指出的那樣,將其命名爲list可能會引起誤解,因爲foreach的返回類型爲Unit。儘管如此,無論您如何宣佈list,情況都是如此。

+4

不,'list'不是一個函數,它是一個方法。該方法返回'Unit'(在Java中或多或少都是'void'),因爲這是它的主體的最後一個表達式的返回類型。 –

+0

你是對的,我在選擇符號方面sl sl不馴,並且在通用OO術語方面考慮差異性,這在這裏並不完全適用。 – dfreeman

0

方法定義不執行該方法。你也必須調用這個方法。

1

在這種情況下,您總是可以明確地爲該值編寫類型,並查看編譯器抱怨類型不匹配。