Scala值初始化

时间:2012-01-18 09:53:59

标签: scala

为什么在这个例子中,没有抛出错误而b最终保持默认值?

scala> val b = a; val a = 5
b: Int = 0
a: Int = 5

1 个答案:

答案 0 :(得分:11)

在REPL中执行此操作时,您实际上是这样做的:

class Foobar { val b = a; val a = 5 }

b和a按顺序分配,因此在分配b时,有一个字段a,但尚未分配给它,因此它的默认值为0.在Java中,你不能这样做,因为在定义字段之前你不能引用它。我相信你可以在Scala中执行此操作以允许延迟初始化。

如果您使用以下代码,则可以更清楚地看到这一点:

scala> class Foobar {
  println("a=" + a)
  val b = a
  println("a=" + a)
  val a = 5
  println("a=" + a)
}
defined class Foobar

scala> new Foobar().b
a=0
a=0
a=5
res6: Int = 0

如果您制作方法,则可以分配正确的值:

class Foobar { val b = a; def a = 5 }
defined class Foobar
scala> new Foobar().b
res2: Int = 5

或者你可以做一个懒惰的val:

scala> class Foobar { lazy val b = a; val a = 5 }
defined class Foobar

scala> new Foobar().b
res5: Int = 5