我在下面的"编程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)
}
}
Run Code Online (Sandbox Code Playgroud)
上面代码的结果是:
In AbstractT2:
AbstractT2: value = 0, inverse = Infinity
In c2b:
c2b.value = 10, inverse = Infinity
Run Code Online (Sandbox Code Playgroud)
由于匿名类初始化是在特征初始化之后,因此结果是可以理解的.但是,如果我交换在上面的例子中第1行和第2行,以便val value = 10先于println("In c2b:"),结果将是:
In AbstractT2:
AbstractT2: value = 10, inverse = 0.1
In c2b:
c2b.value = 10, inverse = 0.1
Run Code Online (Sandbox Code Playgroud)
看来这次初始化是成功的,尽管从语言的角度来看它是错误的.我不明白为什么.有人可以帮忙吗?非常感谢.
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |