3

在以下示例中:

def maybeTwice2(b: Boolean, i: => Int) = {
  lazy val j = i
  if (b) j+j else 0
}

为什么当我这样称呼它时 hi 没有打印两次:

maybeTwice2(true, { println("hi"); 1+41 })

这个例子实际上来自《Scala 中的函数式编程》一书,给出的原因是为什么“hi”没有被打印两次,这对我来说不够有说服力。所以只想在这里问这个!

4

2 回答 2

5

那么i给出整数的函数对吗?当您调用该方法时,您将传递b为 true 并执行 if 语句的第一个分支。

发生的情况是,它j被设置为i,然后第一次在计算中使用它执行函数,打印“hi”并缓存结果值1 + 41 = 42。第二次使用时,结果值已经计算出来,因此函数返回 84,因为lazy val j.

于 2015-01-13T11:17:12.213 回答
3

这个SO 答案探讨了惰性 val 是如何在内部实现的。In j + j,j是一个惰性 val,相当于一个函数,它执行您为定义惰性 val 提供的代码,返回一个整数并将其缓存以供进一步调用。所以它打印hi并返回1+41 = 42。然后第二个j被评估,并调用相同的函数。除了这一次,它不是运行您的代码,而是从缓存中获取值 (42)。然后将两个整数相加(返回 84)。

于 2015-01-13T11:24:55.267 回答