【问题标题】:Better one liner to generate n spaces更好的一个衬垫来生成 n 个空间
【发布时间】:2012-03-31 17:49:00
【问题描述】:

是的,这是一个有趣的问题,但我想学习正确使用集合操作,如 map、reduce 和 fold。

我这样做了:

scala> Range(0,3) map(_=>" ") reduceLeft(_+_)
res15: java.lang.String = "   "

使用集合操作生成 n 个空间的更好的惯用方法是什么?

【问题讨论】:

    标签: scala


    【解决方案1】:

    我猜从技术上讲,以下是“收集操作”,因为StringOpsscala.collection.immutable 包中:

    scala> " " * 3
    res1: String = "   "
    

    这里发生的事情是" "scala.Predef.augmentString 隐式转换为StringOps 的实例,然后调用StringOps 上的* 方法。


    更新:我的意思部分是在开玩笑,因为这显然不是你所说的“收集操作”——它不是像 map 或 @ 这样的高阶函数987654332@。我肯定会在实际代码中使用我的版本(StringOps 版本),但如果您想使用高阶函数(出于教育原因,类似问题等),我认为您的版本非常接近惯用语。我个人会使用until 来构建范围,并使用reduce 而不是reduceLeft(因为串联是关联的)——即几乎virtualeyes 在他或她的答案中所写的内容。

    【讨论】:

    • 不错,没想到 Scala 做到了 Ruby/Groovy,但确实做到了 ;-)
    【解决方案2】:

    不如 Travis 解决方案优雅,但恕我直言,这是迄今为止第二优雅的方式:

    List.fill (3)(' ').mkString 
    

    【讨论】:

      【解决方案3】:
      1 until 10 map (_=> " ") reduce(_+_)
      

      是另一种可能更易读的方法

      【讨论】:

        【解决方案4】:

        我觉得foldLeft更合适:

        Range(0,3).foldLeft("")((str, i) => str + " ")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-12
          • 1970-01-01
          • 2010-09-08
          • 2017-11-10
          • 1970-01-01
          • 2016-04-29
          • 2011-07-10
          相关资源
          最近更新 更多