Инициализация значений Scala - PullRequest
5 голосов
/ 18 января 2012

Почему в этом примере не выдается ошибка, и в результате b содержит значение по умолчанию?

scala> val b = a; val a = 5
b: Int = 0
a: Int = 5

1 Ответ

11 голосов
/ 18 января 2012

Когда вы делаете это в REPL, вы фактически выполняете:

class Foobar { val b = a; val a = 5 }

b и a назначаются по порядку, поэтому в то время, когда вы назначаете b, есть поле a, но он еще не был назначен, поэтому он имеет значение по умолчанию 0. В Java вы не можете сделать это, потому что вы не можете ссылаться на поле до того, как оно будет определено.Я полагаю, что вы можете сделать это в Scala, чтобы разрешить отложенную инициализацию.

Вы можете увидеть это более четко, если будете использовать следующий код:

scala> class Foobar {
  println("a=" + a)
  val b = a
  println("a=" + a)
  val a = 5
  println("a=" + a)
}
defined class Foobar

scala> new Foobar().b
a=0
a=0
a=5
res6: Int = 0

Вы можете назначить правильные значения, еслисделать метод:

class Foobar { val b = a; def a = 5 }
defined class Foobar
scala> new Foobar().b
res2: Int = 5

или вы можете сделать ба ленивый val:

scala> class Foobar { lazy val b = a; val a = 5 }
defined class Foobar

scala> new Foobar().b
res5: Int = 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...