对功能文字感到困惑

时间:2014-04-05 18:44:51

标签: scala

Scala新手在这里。

我有一个Set定义并声明如下:

var g = Set(1,2,3)

现在我想使用函数文字打印出Set的每个元素:

scala> g.foreach(s => println(s))
1
2
3

一切都很好。

我可以更简洁,所以我这样做:

scala> g.foreach(println)
1
2
3

一切都很好。

现在我这样做了:

scala> g.foreach(println())
<console>:9: error: type mismatch;
 found   : Unit
 required: Int => ?
              g.foreach(println())

为什么这会失败?对我(一个新手)来说,它似乎相当于g.foreach(println)。请有人解释错误。

3 个答案:

答案 0 :(得分:4)

当您直接传递函数文字或函数时,就像在前两个示例中一样,不会立即调用该函数。但是,在上一个示例中,执行会立即调用它,因为println()正是调用函数和方法的语法。由于println()结果类型为Unit,因此您实际上将类型为Unit的值传递给期望类型为(String) => Unit的值的方法,当然这些是不同的值,因此编译器显示错误。

答案 1 :(得分:2)

它不是等价的,当你传递println时,你传递的函数还需要应用于集合的每个成员,另一方面,传递println()正在通过Unit,但foreach需要传递一个函数,该函数接受集合的任何类型并对其执行某些操作。

答案 2 :(得分:0)

函数println ()在标准输出中输出换行符,返回类型为Unit,例如

val u: Unit = println()

foreach函数需要一个函数来作为其参数应用于集合的每个元素。 println是一个显示每个参数的函数,而Unit不是函数。