scala方法调用后的下划线是什么意思?

时间:2018-09-19 17:06:30

标签: scala

scala documentation的代码示例包含以下行:

val numberFunc = numbers.foldLeft(List[Int]())_

方法调用后的下划线是什么意思?

2 个答案:

答案 0 :(得分:8)

这是部分应用的功能。您仅向foldLeft提供了第一个参数(初始值),但没有提供第二个参数。您将其推迟。在您链接的文档中,他们在下一行定义squares的下一行进行操作:

val numberFunc = numbers.foldLeft(List[Int]())_
val squares = numberFunc((xs, x) => xs:+ x*x)

看到(xs, x) => xs:+ x*x,这是您在定义numberFunc时省略的第二个参数。如果您立即提供了它,那么numberFunc将不是一个函数-它将是计算值。

因此,基本上,整个事情也可以以咖喱形式写成单行:

val squares = numbers.foldLeft(List[Int]())((xs, x) => xs:+ x*x)

但是,如果您想一次又一次地重用foldLeft,具有相同的集合和初始值,但是每次都提供不同的功能,那么定义一个单独的numbersFunc(如他们在文档中做了),并以其他功能重复使用,例如:

val squares = numberFunc((xs, x) => xs:+ x*x)
val cubes = numberFunc((xs, x) => xs:+ x*x*x)
...

请注意,如果您忘记了下划线,则编译器错误消息非常简单:

  

错误:特征中方法foldLeft缺少参数列表   LinearSeqOptimized未应用的方法仅转换为函数   当需要一个函数类型时。您可以进行此转换   通过写foldLeft _foldLeft(_)(_)而不是   foldLeft。 val numberFunc = numbers.foldLeft(ListInt)

编辑:哈哈,我刚刚意识到他们对文档中的cubes做的完全相同。

答案 1 :(得分:2)

我不知道是否有帮助,但是我更喜欢这种语法

val numberFunc = numbers.foldLeft(List[Int]())(_)

然后numberFunc基本上是与等待参数的实例方法(实例为numbers)相对应的委托。后来在scala文档示例中成为lambda表达式