Scala-还有另一种方法来编写这个 foreach 方法吗?

标签 scala recursion foreach functional-programming

我有一个带有 foreach 方法的案例类:

case class Sequence[A](initialElems: A*) {
  private val elems = ArrayBuffer[A]()

  elems ++= initialElems

  @tailrec
  final def foreach(block: A => Unit, elems: ArrayBuffer[A] = elems): Unit = elems.size match {
    case 0 =>
    case _  =>
      block(elems.head)
      foreach(block, elems.tail)
  }
}

但是我觉得很奇怪,有没有另一种更简单、更高效的写法?

最佳答案

当您可以使用现有的 foreach 方法时,根本不清楚为什么您需要递归函数:

case class Sequence[A](initialElems: A*) {
  private val elems = ArrayBuffer[A](initialElems:_*)

  final def foreach(block: A => Unit, elems: ArrayBuffer[A] = elems): Unit =
    elems.foreach(block)
}

能够传入 elems 值也很奇怪。如果您确实传递了一个值,那么此方法不会使用任何类数据,这意味着它实际上不需要是一个方法。

最后,通常将block作为最终参数组,以便可以以更自然的方式使用它,如下所示:

case class Sequence[A](initialElems: A*) {
  private val elems = ArrayBuffer[A](initialElems:_*)

  final def foreach(elems: ArrayBuffer[A])(block: A => Unit): Unit = elems.foreach(block)
  final def foreach(block: A => Unit): Unit = elems.foreach(block)
}

val s = Sequence(1,2,3)

s.foreach{ e =>
  println(e)
}

关于Scala-还有另一种方法来编写这个 foreach 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51436159/

相关文章:

java - 如何遍历通配符泛型?

c# - Parallel.Foreach 在幕后做了什么?

php - 试图获得非对象的属性? PHP/代码点火器

scala - 如何在运行时确定 Scala.js 和 JVM 的 Scala 版本?

json - PlayFramework:如何将一系列 JsValue 实例合并到单个 JSON 文档

scala - 执行上下文和调度程序 - 最佳实践、有用的配置和文档

ruby - 如何将此算法从 Ruby 转换为 Clojure?

algorithm - 同时最大和最小元素的比较次数

scala - 使用蛋糕模式时如何构建 Play 项目

algorithm - 可被 n 整除的非连续元素解决方案不起作用