2014-05-02 166 views
2

我學習Scala的個人興趣,我通過以下,其中我期待的返回值困惑,最終打印52:斯卡拉返回值不是預期

def lexicalTest(a: Int) = { 
    (b: Int) => { 
    (c: Int) => { 
     a + b + c 
    } 
    } 
} 

val step01 = lexicalTest(10) 

val step02 = step01(10) 


def plusThirty(a: Int, b: Int) { 
    a + b 
} 

println(plusThirty(22, step02(10))) 

如果步驟02( 10)肯定會返回30,並且它是Int類型,那麼爲什麼我的返回值等於()

FWIW:我是從使這種事情在JavaScript中工作的角度來的。

更新:謝謝餅乾怪物,def plusThirty(a: Int, b: Int) {應該讀def plusThirty(a: Int, b: Int) = {

+1

我不我不知道關於Scala的一些東西,但我注意到你的'plusThirty'函數的第一行中沒有'='。我在一個在線的Scala評估器中嘗試過,並修復了它。 'def plusThirty(a:Int,b:Int)= {' –

+0

啊!非常感謝你。總是在自己的背部刺傷=)它的工作原理 – biscuitsauce

+0

不客氣。 –

回答

4

在Scala中,按照從reference§4.6如果聲明如下function

def f(n:Somthing) = {} 

那麼除非手動指定的f返回類型爲從塊返回的返回類型取得(感謝類型推斷)。

按照§4.6.3,下面是一個procedure

def f(n:Somthing) {} 

f返回類型是Unit即使它顯示爲Int。逸岸,如果你手動使用return,而不是從隱含return,在REPL它給:

scala> def plusThirty(a: Int, b: Int) { 
    | return a + b 
    | } 
<console>:8: warning: enclosing method plusThirty has result type Unit: return value discarded 
     return a + b 
     ^
plusThirty: (a: Int, b: Int)Unit 

scala> plusThirty(22, step02(10)) 

,以便在評論說,這應該是低於否則它將一直是過程:

def plusThirty(a: Int, b: Int) = { 
    a + b 
} 
+0

這就是爲什麼程序定義語法將在未來版本的Scala中被刪除的原因。 –

+0

Martin Odersky自己現在認爲,明確註釋返回類型「Unit」的「等寬」速記是一個錯誤,並且建議不要這樣做。我同意並且我的組織現在需要我們的代碼中的長手形式。 –