2015-03-31 106 views
1

隐藏递归函数鉴于这种递归函数:模式在斯卡拉

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

这将作为工作的驱动程序。有没有一种模式或斯卡拉成语可以隐藏开发人员的递归结构,所以所有开发人员都需要担心的是实现方法doSomeWork()

回答

9

您可以在一个功能(即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或迭代器,然后将它传递给了数据流的mapforeach方法调用doSomeWork - 尽管这需要对代码进行更多的更改。