当我遵循特定教程时,我碰巧看到以下两个用法给出了相同的结果。我理解第一个,但我不明白为什么第二个也有效。有人可以给我一个解释,同时给出_用法的摘要吗?
def sum (a:Int, b:Int) = a + b
val sumAsFunction1 = sum(_:Int, _:Int)
// I understand this, _ used as placeholder of parameters
val sumAsFunction2 = sum _
// why this usage has the same effect as sumAsFunction1?
答案 0 :(得分:1)
这是 eta-expansion 机制需要一些帮助的少数几个地方之一。考虑一个更简单的例子:
def foo() = {
println("foo");
42
}
val bar1 = foo
val bar2 = foo _
bar1
和bar2
之间存在根本区别。前者被解释为调用foo
并将值分配给bar
,而后者:将方法foo
更改为函数并将其分配给{ {1}} 的。因此,bar2
只是一个简单的bar1
变量,而Int
实际上是一个调用原始bar2
方法(并打印foo()
)的函数。
答案 1 :(得分:1)
下划线用于很多事情,但在这种情况下,它用来表示你想要{{1}}函数的未调用版本。
您定义sum
,因此将sum(a: Int, b:Int) = a + b
视为一个匿名函数,它接受两个参数并返回它们的总和。您可以传递函数,因为它是Function2[Int,Int,Int]的实例。