在 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 的 map
或 foreach
方法来调用 doSomeWork
- 虽然这会需要对您的代码进行更多更改。
鉴于此递归函数:
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 的 map
或 foreach
方法来调用 doSomeWork
- 虽然这会需要对您的代码进行更多更改。