在 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 扩展。
我是 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 扩展。