Scala lazy val缓存

时间:2015-01-13 11:08:07

标签: scala thunk

在以下示例中:

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

为什么我打电话时不打印两次:

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

这个例子实际上来自书" Scala中的功能编程"以及为什么" hi"不打印两次对我来说不够令人信服。所以只想到这里问这个!

2 个答案:

答案 0 :(得分:4)

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

j设置为i并且第一次稍后在计算中使用它执行函数,打印“hi”并缓存结果值1 + 41 = 42时会发生什么? 。第二次使用时,结果值已经计算出来,因此函数返回84,而不需要因lazy val j而计算两次函数。

答案 1 :(得分:3)

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