起初我认为使用下划线来制作闭包(例如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))
这里发生了什么?用下划线创建闭包的规则是什么?