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

2024-02-13

The 斯卡拉文档 https://docs.scala-lang.org/tour/multiple-parameter-lists.html有一个代码示例,其中包含以下行:

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

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


这是一个部分应用的函数。您只需提供第一个参数即可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 _ or foldLeft(_)(_)代替foldLeft。 val numberFunc = numbers.foldLeft(ListInt)

编辑:哈哈我刚刚意识到他们做了完全相同的事情cubes在文档中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐