1

以下方法有什么区别?

def sum1() = 1+2

def sum2(a:Unit) = 1+2

我认为它们在语义上是相同的,对吗?

4

3 回答 3

6

使用sum1,您可以使用或不使用括号来调用它:

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

但是 withsum2你被迫提供括号。我认为如果你打电话sum2(),你实际上是在打电话sum2with()作为参数a

val x2 = sum2   // error
val y2 = sum2() // y2: Int = 3
于 2012-05-26T18:37:24.910 回答
2

请注意,将 unit 作为参数传递给表达式可以让您以严格的语言模拟惰性求值。通过“在 lambda 下移动评估”,您可以确保表达式在传入之前不会被评估()。这对于例如自动记忆数据结构很有用,这些数据结构在第一次从函数崩溃到一个值时重新检查。

于 2012-05-26T20:46:03.587 回答
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
于 2012-05-27T06:54:07.813 回答