有人可以向我解释为什么给出这个对象:
object HelloWord {
println("hello world")
var z = 1
z += {
println("adding 1 to z")
1
}
}
在REPL中运行以下代码:
import HelloWorld._
// no output
z
// hello world
// adding 1 to z
// res0: Int = 2
z
// res1: Int = 2
为了澄清,我想解释输入REPL的每行代码的输出。
干杯
答案 0 :(得分:4)
Scala对象被懒惰地初始化;首次加载和使用对象时,它们的顶级代码将被执行一次。
导入类不会导致它被加载,所以没有任何反应。
评估REPL中的z
会导致加载对象的类并执行初始化代码。这只会发生一次,就像Java中的静态初始化器一样。
在REPL中再次评估z
会打印出上一次初始化的值。初始化代码不会再次运行,因此println
语句都没有执行。