Рассмотрим этот фрагмент:
object A {
val b = c
val c = "foo"
}
println( A.b ) // prints "null"
Как часть более крупной программы, это привело бы к сбою во время выполнения. Компилятор, по-видимому, разрешает прямую ссылку с 'b' на (неинициализированный) 'c', но 'b' остается с исходным нулевым значением c. Почему это разрешено? Существуют ли сценарии программирования, которые выиграют от этой функции?
Измените код на прямую последовательность, и поведение изменится:
val b = c
val c = "foo"
println( b ) // prints "foo"
Почему поведение отличается? И почему это вообще работает? Спасибо.
Обновление 1:
Возник вопрос, как я запустил второй пример. Я немного упростил настройку и скомпилировал ее с использованием Scala 2.9.0.1 внутри IntelliJ IDEA 10.5.2 с последним плагином Scala. Вот точный код в только что созданном и пустом проекте, который я использую для тестирования, который компилируется и отлично работает в этой среде:
package test
object Main {
def main( args: Array[String] ) {
val b = c
val c = "foo"
println( b ) // prints "foo"
}
}
Что бы это ни стоило, IDEA также думает (когда я нажимаю «через» ссылка на 'c' в val b = c), что я имею в виду (более позднее) объявление 'c'.