以下方法有什么区别?
def sum1() = 1+2
def sum2(a:Unit) = 1+2
我认为它们在语义上是相同的,对吗?
使用sum1
,您可以使用或不使用括号来调用它:
val x = sum1 // x: Int = 3
val y = sum1() // y: Int = 3
但是 withsum2
你被迫提供括号。我认为如果你打电话sum2()
,你实际上是在打电话sum2
with()
作为参数a
。
val x2 = sum2 // error
val y2 = sum2() // y2: Int = 3
请注意,将 unit 作为参数传递给表达式可以让您以严格的语言模拟惰性求值。通过“在 lambda 下移动评估”,您可以确保表达式在传入之前不会被评估()
。这对于例如自动记忆数据结构很有用,这些数据结构在第一次从函数崩溃到一个值时重新检查。
这些方法并不完全相同。一旦接收到一个参数,另一个则不接收。看这里:
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