为什么在这个例子中,没有抛出错误而b最终保持默认值?
scala> val b = a; val a = 5
b: Int = 0
a: Int = 5
答案 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