Scala NullPointerException если не ленивый

  def fix[A, B](fn : Function2[Function1[A, B], A, B]) : Function1[A, B] =
    (x : A) => fn(fix(fn), x)

  lazy val fibs1 = fix[(Int, Int), Stream[Int]](
    (fn, a) => a._1 #:: fn((a._2, a._1 + a._2))
  )

  val fibs2 = fix[(Int, Int), Stream[Int]](
    (fn, a) => a._1 #:: fn((a._2, a._1 + a._2))
  )

Во время изучения Scala я столкнулся со странной ошибкой. Почему это fibs1((1,1))не приводит к ошибке, в то время fibs2((1, 1))как дает исключение нулевого указателя?

РЕДАКТИРОВАТЬ:

Этот код был внутри класса приложения. Похожеval, что s не инициализируются, пока instance.main(...)не будет оценен. Я предполагаю, что реализация для lazy vals отличается.

1 ответ

  1. Вы правы. некоторый val не был инициализирован, но так как вы делаете его ленивым val, он оценивался только при необходимости, и в то время он уже был инициализирован некоторым кодом, который вы не контролируете