0

在 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) )
4

1 回答 1

1

不,不需要将它们放入花括号中。这是你的选择,我猜 Erik 选择了花括号,因为这是通常调用函数的方式。一旦你有多个语句,你将不得不使用花括号,因为括号仅用于单个表达式。

在递归调用中,只有一个表达式(即block),因此您可以根据需要保留花括号。不要有任何区别。

提供一些值得信赖的参考:在第 6 页的 Martin Odersky 的Scala by Example中,您会在一个非常相似的用例中找到按名称参数调用的示例,但没有大括号:

def While (p: => Boolean) (s: => Unit) {
  if (p) { s ; While(p)(s) }
}
于 2014-10-06T12:10:59.587 回答