Scala代码段中的表示法不清楚

时间:2014-08-13 10:48:33

标签: scala functional-programming

我正在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]]。你能帮忙把握吗?

1 个答案:

答案 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]]