我对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 进行评估,或者只是评估,但不会将评估的结果值存储到预期的变量中。
提前致谢。
答案 0 :(得分:4)
简答:不。
更长的答案:类型推断算法不需要运行代码,它只需要分析抽象语法树(解析器生成的代码的结构化表示)来推断类型和lazy val
s不例外。
答案 1 :(得分:3)
现在,我的问题是,Scala解释器实际上是对表达式 lazily 进行评估,或者只是评估,但不会将评估的结果值存储到预期的变量中。
很容易看出它必须是第一个,因为如果它是第二个,Hello, World!!!
将被打印两次。