gpt4 book ai didi

scala - 在 Scala 中,使用下划线进行闭包的规则是什么?

转载 作者:行者123 更新时间:2023-12-01 10:35:23 25 4
gpt4 key购买 nike

起初我认为使用下划线来做闭包(例如println _)只是使用箭头的简写(例如x => println x),但是我最近才了解到您还可以执行以下操作:

def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce(f _)

根据我过去的假设,f _ 看起来像一个只接受一个参数并将一个参数传递给 f 的闭包。我假设它会告诉我它无法编译,因为 f 需要两个参数,而 reduce 应该需要一个有两个参数的函数。但它就像我写的一样:

def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce((x, y) => f(x, y))

这是怎么回事?使用下划线创建闭包的规则是什么?

最佳答案

没什么特别的。方法 reduce 接受一个函数,该函数接受两个 Int 并生成一个 Int,因此为它提供一个 f 是可行的美好的。请注意,当您说 f _ 时,它实际上扩展为 x => f x(或者,如果有两个参数,例如此处,(x, y) = > f(x, y)).您也可以只提供 f ,然后将直接使用它,而无需额外的匿名函数包装器。

通过执行 f _ 将方法转换为函数称为 eta-expansion (完全披露:我写了那篇文章)。差异是微妙的;函数是一个值,而方法是您在为其定义的对象上调用的方法,例如我的对象.我的方法。函数可以独立存在,也可以保存在集合中等。将方法 f 直接定义为函数将是 val f: (Int, Int) => Int = (a: Int, b: Int) => a + b 或者,通过类型推断,val f = (a: Int, b: Int) => a + b

顺便说一句,我不明白这是怎么回事。

关于scala - 在 Scala 中,使用下划线进行闭包的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40118094/

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