我正在Coursera学习反应性编程的Principels课程,并注意到几次我无法完全理解的符号。所以我希望你能帮助我理解。 以下是代码段:
def retry(noTimes:Int)(block: => Future[T]): Future[T] = {
val ns: Iterator[Int] = (1 to noTimes).iterator
val attempts: Iterator[Future[T]] = ns.map(_ => () => block)
val failed = Future.failed(new Exception)
attempts.foldLeft(failed) ((a, block) => a recoverWith {block()})
}
我不清楚为什么在attempts
值定义中它不仅仅是ns.map(_ => block)
?
attempts
值的类型为Iterator[Future[T]]
和map
因为它在代码段中写入,我觉得应该生成Iterator[() => Future[T]]
。你能帮忙把握吗?
答案 0 :(得分:2)
有了这个:
ns.map(_ => block)
块将直接执行,这不是作者想要的 与按值调用参数类似。
然而,有了这个:
ns.map(_ => () => block)
,它类似于 Call-By-Name 参数,这意味着只有在底层函数中显式调用时才会执行块代码。
如果我没记错的话,该课程的作者会说:
“坐下来,喝杯咖啡,深入分析这个功能,以便找出我们为什么需要懒洋洋地执行block
代码”;)
<强> UPDATE ------- 强>
在wrap方法的签名中,block
被声明为call-by-name参数:
block: => Future[T]
因此,Future[T]
井对应() => block
解释原因:
val attempts: Iterator[Future[T]]
不是val attempts: Iterator[() => Future[T]]