Scala lazy val是否实际计算表达式以在赋值期间获取最终类型

时间:2016-09-28 11:36:32

标签: scala lazy-evaluation

我对Scala完全不熟悉。我对REPL中lazy val的行为感到困惑。

scala> lazy val a = {println("Hello, World!!!"); 5}
a: Int = <lazy>

scala> a
Hello, World!!!
res0: Int = 5

我可以看到,在REPL中,lazy val a的类型已在声明后立即正确分配。

现在,我的问题是,Scala解释器实际上是对表达式 lazily 进行评估,或者只是评估,但不会将评估的结果值存储到预期的变量中。

提前致谢。

2 个答案:

答案 0 :(得分:4)

简答:不。

更长的答案:类型推断算法不需要运行代码,它只需要分析抽象语法树(解析器生成的代码的结构化表示)来推断类型和lazy val s不例外。

答案 1 :(得分:3)

  

现在,我的问题是,Scala解释器实际上是对表达式 lazily 进行评估,或者只是评估,但不会将评估的结果值存储到预期的变量中。

很容易看出它必须是第一个,因为如果它是第二个,Hello, World!!!将被打印两次