在 coursera 课程函数响应式编程第 3 周第 4 课中,Erik Meijer 为 Future 实现了一个重试函数,它将重试计算给定的次数。他指定block
为 call_by_name 参数,因为 Future 应该在每次重试时评估,而不仅仅是一次。
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) )