2012-05-26 22 views
1

以下方法的區別是什麼?單位爲參數

def sum1() = 1+2 

def sum2(a:Unit) = 1+2 

我認爲它們在語義上是相同的,是不是?

回答

6

隨着sum1,你可以帶或不帶括號調用它:

val x = sum1 // x: Int = 3 
val y = sum1() // y: Int = 3 

但隨着sum2你被迫提供括號。我認爲,如果你打電話sum2(),你實際上是用()與調用sum2參數a

val x2 = sum2 // error 
val y2 = sum2() // y2: Int = 3 
+2

一個很好的經驗法則是當計算涉及副作用時需要parens,但當計算是純粹的時候不需要它們。我想你可以用這種方式使用parens,就像Lisp和Ruby使用'!'一樣。 –

2

請注意,將單位作爲參數傳遞給表達式可讓您以嚴格的語言模擬惰性評估。通過「在lambda下移動評估」,確保在()傳入之前不會評估表達式。自動記憶數據結構,這些數據結構在第一次被檢查時從一個函數崩潰到一個值。

2

這些方法不相同。一旦收到參數,另一個不會。看到這裏:

scala> sum1(println("Hi, there!")) 
<console>:9: error: too many arguments for method sum1:()Int 
       sum1(println("Hi, there!")) 
       ^

scala> sum2(println("Hi, there!")) 
Hi, there! 
res1: Int = 3