在Scala中,什么语法规则适用于foreach(println)?

时间:2017-07-24 07:31:18

标签: scala higher-order-functions

我是Scala的初学者,想知道这种语法在Scala中是如何工作的:

val numbers = List(1, 2, 3, 4, 5)

numbers.foreach(println)

我知道Scala中的集合的foreach方法需要一个函数作为参数,在本例中为Int => ?

但是,当您只编写println时,它是否等同于println()返回Unit值?那不是类型不匹配吗?如果我写的话,我可以检查一下:

val my_println = println

在这种情况下,Unit值存储在my_println

当第三行代码被foreach(println _)替换时,我可以理解代码,因为println _是部分应用的函数。但适用于foreach(println)的规则是什么?

2 个答案:

答案 0 :(得分:1)

foreach()签名:

def foreach(f: (A) ⇒ Unit): Unit

println()签名:

def println(x: Any): Unit

注意foreach()参数和println()签名之间的相似性?所以println()可以直接传递,因为它的类型正确。

除了:println()是一种方法而foreach()是一种功能。它们不是一回事,那怎么办?事实证明,当提供需要函数的方法时,编译器会执行自动幕后eta扩展。

答案 1 :(得分:0)

编译器会自动强制执行该方法并使用eta-expansion:

示例:

class test {
    def m1(x:Int) = x+3

    val l =  List(1,2,3).map(m1)
 }

编译成(简化)

l2 = l.map(x -> this.m1(x))