该阶文档具有一个代码示例,其包括下面的行:
val numberFunc = numbers.foldLeft(List[Int]())_
Run Code Online (Sandbox Code Playgroud)
方法调用后的下划线是什么意思?
这是部分应用的功能.您只提供第一个参数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在文档中完成了同样的事情.