2017-10-04 49 views
2

我有兩個函數聲明爲VAL兩個功能VAL聲明給出了兩個不同的結果

val add2: (Int, Int) => Int = (x,y) => { 
    println("add2 called") 
    x + y 
} 

val add3: (Int, Int) => Int = { 
    println("add2 called") 
    _ + _ 
} 

當我嘗試運行他們,我得到兩個不同的結果

add2(1,2) 
add2 called 
res7: Int = 3 

add3(1,2) 
res8: Int = 3 

我不明白爲什麼這兩個函數會給出不同的結果。

也許我誤表了自己。在第一種情況下,在第二種情況下沒有副作用。但我收到兩個變量具有不同功能

+0

你確定它提供了不同的結果嗎? – Pavel

+0

結果是一樣的嗎? –

+0

在第一種情況下,我打印字符串在第二個不 –

回答

5

第一語法val add2: (Int, Int) => Int = (x,y) => ...正在申報的屍體是一個函數:

println("add2 called") 
x + y 

時間的函數被調用println執行接着返回的值的代碼塊的x + y

第二語法聲明瞭一個匿名函數作爲結果/值:

{ 
    println("add2 called") 
    _ + _ 
} 

的代碼塊的值只是最後一行:_ + _println在時刻當正在分配add3執行只有一次

認爲相同的方式,這個片段的第二示例的分配值42到x

val x = { 
    println("Calculating") 
    val a = 21 
    val b = 21 
    a + b 
} 

澄清:

兩種語法在共同擁有這一部分:val add: (Int, Int) => Int = ...即類型聲明「這將是一個函數,需要兩個Ints並返回一個Int」,讓我們來看看不同的位:

第一個指定... = (x,y) => { ... }即指定使用=>運算符聲明的函數。

第二個示例分配塊... = { ... }的值,其中塊(它的最後一行)的值是使用one Scala's uses for underscores的匿名函數。

+0

在這裏不明確。編譯器如何決定在第一種情況下他具有完整的函數體,但在第二種情況下,他必須只返回結果。只有通過匿名聲明? –

+0

我有刺傷加入一些澄清。讓我知道這是否有幫助! – mikej

+1

非常感謝您的幫助。問題已關閉。 –

相關問題