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

vae*_*r-k 4 scala

阶文档具有一个代码示例,其包括下面的行:

val numberFunc = numbers.foldLeft(List[Int]())_
Run Code Online (Sandbox Code Playgroud)

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

slo*_*ouc 8

这是部分应用的功能.您只提供第一个参数foldLeft(初始值),但不提供第二个参数; 你推迟了以后.在您链接的文档中,他们会在下一行中执行此操作,并在其中定义squares:

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

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

所以基本上整个事情也可以写成咖喱形式的单行:

val squares = numbers.foldLeft(List[Int]())((xs, x) => xs:+ x*x)
Run Code Online (Sandbox Code Playgroud)

但是,如果您希望能够一遍又一遍地重复使用foldLeft,拥有相同的集合和初始值,但每次都提供不同的功能,那么定义一个单独的numbersFunc(就像他们在文档中所做的那样)和重用是非常方便的.它具有不同的功能,例如:

val squares = numberFunc((xs, x) => xs:+ x*x)
val cubes = numberFunc((xs, x) => xs:+ x*x*x)
...
Run Code Online (Sandbox Code Playgroud)

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

错误:缺少特征中的方法foldLeft的参数列表LinearSeqOptimized未应用的方法仅在需要函数类型时转换为函数.您可以通过书写foldLeft _foldLeft(_)(_)代替来 明确转换foldLeft.val numberFunc = numbers.foldLeft(ListInt)

编辑:哈哈我刚才意识到他们cubes在文档中完成了同样的事情.