Jas*_*ond 5 scala lazy-evaluation
或者valscala对象默认是懒惰的?
无论如何,如果有必要val通过使用声明一个懒惰的对象lazy,是否可以做类似的事情
lazy object SomeObject
Run Code Online (Sandbox Code Playgroud)
或者(就像你在c ++中所做的那样)
object A {
lazy:
val a
val b
...
}
Run Code Online (Sandbox Code Playgroud)
因为我想要懒惰而不必重新贴上我val的所有lazy val
Tra*_*own 11
回答你的第一个问题(" valscala对象在默认情况下是懒惰的吗?"):不,不完全是,但对象本身有点懒,可能很懒.从Scala语言规范的 5.4("对象定义")开始:
请注意,对象定义定义的值是懒惰实例化的.该
new m$cls构造函数是在对象定义的点没有评估,而是评估第一次m程序(这可能是从来没有的话)的执行过程中被取消引用.
所以,例如,如果我们有这三个对象:
object X {
val answer = { println("Here's X's answer!"); 42 }
}
object Y {
lazy val answer = { println("Here's Y's answer!"); 1 }
}
object Z extends App {
println("Here we go.")
println(X)
println(Y)
println(X.answer)
println(Y.answer)
}
Run Code Online (Sandbox Code Playgroud)
然后当我们运行时Z,我们看到以下内容:
Here we go.
Here's X's answer!
X$@38d24866
Y$@f1aa6ce
42
Here's Y's answer!
1
Run Code Online (Sandbox Code Playgroud)
因此valin X不是懒惰,但直到我们第一次使用它时才会进行评估X.