2014-10-06 60 views
0

在課程中功能反應式編程第3周第4講Erik Meijer爲未來實現了一個重試函數,它將重試一個給定次數的計算。他指定block作爲call_by_name參數,因爲應在每次重試時評估Future,而不僅僅評估一次。callbyname參數是否必須在功能調用的捲曲支配中包裝?

def retry(noTimes: Int)(block: =>Future[T]): Future[T] = { 
    if (noTimes == 0) { 
    Future.failed(new Exception(「Sorry」)) 
    } else { 
    block fallbackTo { 
     retry(noTimes–1) { block } 
    } 
    } 
} 

我的問題是:由於block已經call_by_name參數,是否有必要把它包裝成一個塊上調用它,或只是可讀性原因?

retry(noTimes–1) { block } 
//same as? 
retry(noTimes–1)(block) 

fallbackTo

def fallbackTo(that: =>Future[T]): Future[T] = { 
    this recoverWith { 
    case _ => that recoverWith { case _ ⇒ this } 
} 

fallbackTo { retry(noTimes–1) { block } } 
//same as? 
fallbackTo (retry(noTimes–1)(block)) 

回答

1

沒有同樣的問題,所以不需要把它們放到花括號。這是你的選擇,我猜Erik選擇了花括號,因爲這是典型的函數調用方式。只要您使用多個語句,您將不得不使用大括號,因爲括號僅用於單個表達式。

在遞歸調用中,只有一個表達式(即block),因此如果需要,可以留下大括號。沒有任何區別。

要扔在一些值得信賴的參考:在第6頁上的馬丁·奧德斯基的Scala by Example,你會發現通過名稱參數調用的例子非常類似用途的情況下,但沒有大括號:

def While (p: => Boolean) (s: => Unit) { 
    if (p) { s ; While(p)(s) } 
}