Scala中使用的下划线字符是什么?

时间:2012-05-26 18:32:59

标签: scala

  

可能重复:
  What are all the uses of an underscore in 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?

2 个答案:

答案 0 :(得分:1)

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

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

val bar1 = foo
val bar2 = foo _

bar1bar2之间存在根本区别。前者被解释为调用foo并将值分配给bar ,而后者:将方法foo更改为函数并将其分配给{ {1}} 的。因此,bar2只是一个简单的bar1变量,而Int实际上是一个调用原始bar2方法(并打印foo())的函数。

答案 1 :(得分:1)

下划线用于很多事情,但在这种情况下,它用来表示你想要{​​{1}}函数的未调用版本。

您定义sum,因此将sum(a: Int, b:Int) = a + b视为一个匿名函数,它接受两个参数并返回它们的总和。您可以传递函数,因为它是Function2[Int,Int,Int]的实例。