我是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)
的规则是什么?
答案 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))