2014-10-06 61 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) } 
}