LINUX.ORG.RU

Вопрос по Scala - доступ к переменной объекта

 


0

3

Следующий код:

object Main extends App {
    val eps = 0.0001
    val foo = "Hello"

    def test() {
        println(Main.eps)
        println(Main.foo)
/*
Это:
        println(eps)
        println(foo)
выводит то же самое - 0.0 и null
*/
    }
}
Main.test()

выводит:
0.0
null

Почему eps и foo не иницилизируются и выводятся значения 0.0 и null, а не 0.0001 и «Hello»? Что нужно исправить?

На сколько я понимаю, то приведенный пример из REPL.

По факту, инициализация eps и foo происходит в delayedInit (или что-то такое, что растет ногами из App и специальной обработки компилятором этого наследования). При приведенном выше примере вызова кода, дергается статический метод test класса Main, но без вызова кода инициализации полей объекта, потому и получается такое поведение. Убирание наследования от App исправит данную ситуацию.

anonymous ()
Ответ на: комментарий от anonymous

И в догонку: для изучения почему код работает так, как работает весьма полезно смотреть на выхлоп из scalap/javap для понимания того, что нагенерил компилятор.

anonymous ()
Ответ на: комментарий от anonymous

Да, действительно, если переписать так:

object Main {
  val eps = 0.0001
  val foo = "Hello"

  def main(args: Array[String]) {
    test()
  }
  def test() {
    println(eps)
    println(foo)
  }
}

выводится как ожидалось. Спасибо ;)

За javap и scalap отдельное спасибо, полезно.

ProtoH ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.