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

In Scala, what syntax rules apply to foreach(println)?

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

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

numbers.foreach(println)

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

然而,当你只写 println 时,它不等于 println() returns 一个 Unit 值吗?那不就是类型不匹配吗?我可以检查这个,如果我写:

val my_println = println

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

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

编译器自动强制转换方法并使用 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))

foreach()签名:

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

以及 println() 签名:

def println(x: Any): Unit

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

除了:println() 是一个方法,foreach() 是一个函数。它们不是同一回事,那么它是如何工作的呢?事实证明,当在需要函数的地方提供方法时,编译器会在幕后自动执行 eta 扩展。