Прямые ссылки - почему этот код компилируется?

Рассмотрим этот фрагмент:

 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'.

27
задан Nathaniel Ford 13 June 2013 в 17:21
поделиться