起初我认为使用下划线来制作闭包(例如println _
)只是使用箭头(例如x => println x
)的简写,但我最近才知道您还可以执行以下操作:
def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce(f _)
鉴于我过去的假设,f _
看起来像一个闭包,它只接受一个参数并将一个参数传递给f
. 我以为它会告诉我它无法编译,因为f
需要两个参数,并且reduce
应该需要一个带有两个参数的函数。但它就像我写的那样工作:
def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce((x, y) => f(x, y))
这里发生了什么?用下划线创建闭包的规则是什么?