什么时候评估Scala对象中的代码?

When is code in Scala objects evaluated?

有人可以向我解释为什么给出该对象:

1
2
3
4
5
6
7
8
object HelloWord {
  println("hello world")
  var z = 1
  z += {
    println("adding 1 to z")
    1
  }
}

在REPL中运行以下代码将给出:

1
2
3
4
5
6
7
8
import HelloWorld._
// no output
z
// hello world
// adding 1 to z
// res0: Int = 2
z
// res1: Int = 2

为澄清起见,我想解释一下输入到REPL中的每一行代码的输出。

干杯


Scala对象被延迟初始化;第一次加载和使用该对象时,它们的顶级代码将执行一次。

导入一个类不会导致它被加载,因此什么也没发生。

在REPL中评估z会导致加载对象的类并执行初始化代码。就像Java中的静态初始化程序一样,这只会发生一次。

在REPL中再次

评估z会打印出先前初始化的值。初始化代码不会再次运行,因此println语句都不会执行。