何时评估Scala对象中的代码?

时间:2015-05-27 20:13:36

标签: scala

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

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的每行代码的输出。

干杯

1 个答案:

答案 0 :(得分:4)

Scala对象被懒惰地初始化;首次加载和使用对象时,它们的顶级代码将被执行一次。

导入类不会导致它被加载,所以没有任何反应。

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

在REPL中再次评估z会打印出上一次初始化的值。初始化代码不会再次运行,因此println语句都没有执行。