鉴于此递归函数:
def visitAll(s: String): Unit = {
val files = getFiles
for (a <- files) {
visitAll(s)
doSomeWork()
}
}
这将成为工作的驱动力。是否有一个模式或Scala成语允许隐藏开发人员的递归结构,所以所有开发人员都需要担心的是实现方法doSomeWork()
?
答案 0 :(得分:9)
你可以简单地传递一个函数(即doSomeWork
),如下所示:
def visitAll(s: String, f: () => Any): Unit = {
val files = getFiles
for (a <- files) {
visitAll(s, f)
f()
}
}
然后这样称呼它:
visitAll("foo", doSomeWork)
该函数传递递归调用,并在需要时执行。
另一种模式是提供一个curried call-by-name参数而不是函数:
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的doSomeWork
或map
方法来调用foreach
- 尽管这需要更多更改代码。