2015-03-31 76 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 - 儘管這需要對代碼進行更多的更改。