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)
。请有人解释错误。
答案 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
不是函数。