我有两个声明为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 :(得分: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的匿名函数。