在 Scala 中隐藏递归函数的模式

Pattern for hiding recursive function in Scala

鉴于此递归函数:

 def visitAll(s: String): Unit = {
    val files = getFiles
    for (a <- files) {
      visitAll(s)
      doSomeWork()
    }
  }   

这将作为工作的驱动程序。是否存在允许对开发人员隐藏递归结构的模式或 Scala 惯用语,因此所有开发人员需要担心的是实现方法 doSomeWork() ?

您可以简单地传入一个函数(即doSomeWork),如下所示:

  def visitAll(s: String, f: () => Any): Unit = {
    val files = getFiles
    for (a <- files) {
      visitAll(s, f)
      f()
    }
  }

然后这样称呼它:

visitAll("foo", doSomeWork)

函数传递递归调用,并在需要时执行。

另一种模式是提供柯里化的按名称调用参数而不是函数:

  def visitAll(s: String)(f: => Any): Unit = {
    val files = getFiles
    for (a <- files) {
      visitAll(s)(f)
      f
    }
  }  

然后你可以用代码块调用它,例如

visitAll("foo") {
   println("doing some work")
}

以及传递函数:

visitAll("foo")(doSomething)

另一种方法是创建文件的 Stream 或 Iterator,然后通过将其传递给 Stream 的 mapforeach 方法来调用 doSomeWork - 虽然这会需要对您的代码进行更多更改。