0

可能重复:
Scala 中下划线的所有用途是什么?

当我遵循特定教程时,我碰巧看到以下两种用法给出了相同的结果。我理解第一个,但我不明白为什么第二个也有效。谁能给我一个解释,同时总结一下_的用法?

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?
4

2 回答 2

1

这是eta 扩展机制需要帮助的少数几个地方之一。考虑一个更简单的例子:

def foo() = {
  println("foo"); 
  42
}

val bar1 = foo
val bar2 = foo _

bar1和之间有根本的区别bar2。前者被解释为调用foo并赋值给,bar而后者:将方法foo变为函数并赋值给bar2。结果bar1只是一个简单的Int变量,而bar2实际上是一个将调用原始foo()方法(和 print "foo")的函数。

于 2012-05-26T18:42:09.543 回答
1

下划线用于很多事情,但在这种情况下,它用于表示您想要sum函数的未调用版本。

你定义sum(a: Int, b:Int) = a + b了 ,所以可以把它想象sum _成一个匿名函数,它接受两个参数并返回它们的总和。您可以传递该函数,因为它是Function2[Int,Int,Int]的一个实例。

于 2012-05-26T18:42:56.077 回答