Почему результат отличается для крошечного изменения относительно инициализации абстрактного признака члена val? - PullRequest
2 голосов
/ 17 сентября 2010

Я получил следующий фрагмент кода со ссылкой на пример в главе 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

Кажется, на этот раз инициализация прошла успешно, хотя это неправильно с языковой точки зрения. Я не могу понять почему. Кто-нибудь может помочь в этом? Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 17 сентября 2010

Семантика инициализации изменена с 2.7 на 2.8.Вот коммит, еще в 2008 году. "HARD HATS ON!"

https://lampsvn.epfl.ch/trac/scala/changeset/16745

3 голосов
/ 17 сентября 2010

До 2,7 инициализации перемещенных значений в Scala перед конструктором суперкласса до инициализации, которая ссылается на this. Там это остановится. Намного, намного раньше, это поведение было необходимо для работы некоторых шаблонов композиции. Позже мы ввели ранние определения, чтобы заставить те же шаблоны работать более надежно. Но так как поведение было трудно изменить, нам потребовалось до 2.8, чтобы действительно сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...