【发布时间】:2011-12-16 17:37:33
【问题描述】:
我来自 Groovy,它在每个接受单参数闭包的类型上都有一个 .with 方法;参数是调用.with 方法的对象。这允许使用一种非常酷的技术来扩展函数链接功能,它使您无需引入临时变量、考虑代码、使其更易于阅读并进行其他细节处理。
我希望能够做这样的事情:
Seq(1, 2, 3, 4, 5)
.filter(_ % 2 == 0)
.with(it => if (!it.isEmpty) println(it))
代替
val yetAnotherMeaninglessNameForTemporaryVariable =
Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
if (!yetAnotherMeaninglessNameForTemporaryVariable.isEmpty)
println(yetAnotherMeaninglessNameForTemporaryVariable)
换句话说,在第一个示例中,.with 有点类似于.foreach,但不是遍历对象的项目,而是在对象本身上调用一次。所以it 等于Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)。
因为我很惊讶在 Scala 中没有找到类似的东西,所以我的问题是:
- 我错过了什么吗?
- Scala 是否有任何替代技术?
- 如果没有,是否有任何正当理由说明该功能未在 Scala 中实现?
更新: Scala 问题跟踪器上发布了适当的功能请求:https://issues.scala-lang.org/browse/SI-5324。请投票并宣传
【问题讨论】:
-
请注意:
with是 Scala 中的保留字,因此不能将方法命名为相同的东西。它仍然应该以其他名称存在;据我所知,这是 StackOverflow 上最常见的 Scala 问题和答案(“它不存在;像这样制作你自己的”)! -
我认为名称
convert最合适,因此表明此方法应该没有副作用,并且由于它将调用者作为参数并返回一些新内容,因此它必须是某种转换。从这个意义上说,这个函数在标准库中是不可替代的。同样正如stackoverflow.com/a/8538277/485115 中所建议的,还应该有一个名为tap的副作用变体,它返回调用者对象。
标签: scala