我得到了下面的代码片段,参考了“Scala编程”第6章中的一个例子:
object HelloWorld {
def main(args: Array[String]) {
trait AbstractT2 {
println("In AbstractT2:")
val value: Int
val inverse = 1.0 / value // ???
println("AbstractT2: value = " + value + ", inverse = " + inverse)
}
val c2b = new AbstractT2 {
println("In c2b:") //---->line 1
val value = 10 //---->line 2
}
println("c2b.value = " + c2b.value + ", inverse = " + c2b.inverse)
}
}上面代码的结果是:
In AbstractT2:
AbstractT2: value = 0, inverse = Infinity
In c2b:
c2b.value = 10, inverse = Infinity由于匿名类初始化是在特征初始化之后进行的,因此结果是可以理解的。但是,如果我在上面的示例中交换线路1和线路2,以便在println("In c2b:")之前使用val value = 10,结果将是:
In AbstractT2:
AbstractT2: value = 10, inverse = 0.1
In c2b:
c2b.value = 10, inverse = 0.1这一次初始化似乎是成功的,尽管从语言的角度来看是错误的。我不明白为什么。有人能帮上忙吗?非常感谢。
发布于 2010-09-17 22:04:11
在超类构造函数之前,多达2.7次Scala移动值初始化,直到遇到引用this的初始化。到此为止它就会停下来。很早以前,为了让一些组合模式正常工作,这种行为是必要的。后来,我们引入了早期定义,以使相同的模式以更健壮的方式工作。但由于行为很难改变,我们直到2.8才真正做到这一点。
发布于 2010-09-17 15:48:35
初始化语义从2.7更改为2.8。这是提交,早在2008年。“戴上安全帽!”
https://stackoverflow.com/questions/3732933
复制相似问题