Я получил следующий фрагмент кода со ссылкой на пример в главе 6 «Программирование Scala»:
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 в приведенном выше примере, так что val value = 10
предшествует println("In c2b:")
, результат будет:
In AbstractT2:
AbstractT2: value = 10, inverse = 0.1
In c2b:
c2b.value = 10, inverse = 0.1
Кажется, на этот раз инициализация прошла успешно, хотя это неправильно с языковой точки зрения. Я не могу понять почему. Кто-нибудь может помочь в этом? Большое спасибо.