用于隐藏Scala中的递归函数的模式

blu*_*sky 1 design-patterns functional-programming scala

鉴于此递归函数:

 def visitAll(s: String): Unit = {
    val files = getFiles
    for (a <- files) {
      visitAll(s)
      doSomeWork()
    }
  }   
Run Code Online (Sandbox Code Playgroud)

这将成为工作的驱动力.是否有一个模式或Scala成语允许隐藏开发人员的递归结构,所以所有开发人员都需要担心的是实现方法doSomeWork()

DNA*_*DNA 9

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

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

然后像这样调用它:

visitAll("foo", doSomeWork)
Run Code Online (Sandbox Code Playgroud)

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

另一种模式是提供一个curried call-by-name参数而不是一个函数:

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

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

visitAll("foo") {
   println("doing some work")
}
Run Code Online (Sandbox Code Playgroud)

以及传递函数:

visitAll("foo")(doSomething)
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建文件的Stream或迭代,然后调用doSomeWork由它传递给mapforeach在流的方法-尽管这将需要你的代码更多的变化.