两个函数作为val声明给出两个不同的结果

时间:2017-10-04 08:29:05

标签: scala

我有两个声明为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

我不明白为什么这两个函数会产生不同的结果。

也许我误解了自己。在第一种情况下,在第二种情况下存在副作用。但我收到两个具有不同功能的变量

1 个答案:

答案 0 :(得分:6)

第一个语法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的匿名函数。