gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:29:11 30 4
gpt4 key购买 nike

scala documentation有一个代码示例,其中包含以下行:

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

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

最佳答案

这是一个部分应用的函数。您只向 foldLeft 提供第一个参数(初始值),但不提供第二个参数;你推迟一下。在您链接的文档中,他们在下一行中定义了正方形:

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

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

所以基本上整个事情也可以写成柯里化(Currying)形式的一行:

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)
...

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

Error: missing argument list for method foldLeft in trait LinearSeqOptimized Unapplied methods are only converted to functions when a function type is expected. You can make this conversion explicit by writing foldLeft _ or foldLeft(_)(_) instead of foldLeft. val numberFunc = numbers.foldLeft(ListInt)

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

关于scala - scala 方法调用后的下划线是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52410976/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com