【发布时间】:2012-03-31 17:49:00
【问题描述】:
是的,这是一个有趣的问题,但我想学习正确使用集合操作,如 map、reduce 和 fold。
我这样做了:
scala> Range(0,3) map(_=>" ") reduceLeft(_+_)
res15: java.lang.String = " "
使用集合操作生成 n 个空间的更好的惯用方法是什么?
【问题讨论】:
标签: scala
是的,这是一个有趣的问题,但我想学习正确使用集合操作,如 map、reduce 和 fold。
我这样做了:
scala> Range(0,3) map(_=>" ") reduceLeft(_+_)
res15: java.lang.String = " "
使用集合操作生成 n 个空间的更好的惯用方法是什么?
【问题讨论】:
标签: scala
我猜从技术上讲,以下是“收集操作”,因为StringOps 在scala.collection.immutable 包中:
scala> " " * 3
res1: String = " "
这里发生的事情是" " 被scala.Predef.augmentString 隐式转换为StringOps 的实例,然后调用StringOps 上的* 方法。
更新:我的意思部分是在开玩笑,因为这显然不是你所说的“收集操作”——它不是像 map 或 @ 这样的高阶函数987654332@。我肯定会在实际代码中使用我的版本(StringOps 版本),但如果您想使用高阶函数(出于教育原因,类似问题等),我认为您的版本非常接近惯用语。我个人会使用until 来构建范围,并使用reduce 而不是reduceLeft(因为串联是关联的)——即几乎virtualeyes 在他或她的答案中所写的内容。
【讨论】:
不如 Travis 解决方案优雅,但恕我直言,这是迄今为止第二优雅的方式:
List.fill (3)(' ').mkString
【讨论】:
1 until 10 map (_=> " ") reduce(_+_)
是另一种可能更易读的方法
【讨论】:
我觉得foldLeft更合适:
Range(0,3).foldLeft("")((str, i) => str + " ")
【讨论】: