Могу ли я проверить, оценивался ли ленивый вал в Scala?

Например, в методе toString я хотел бы предоставить информацию о том, был ли оценен ленивый член val класса, и если да, напечатайте его значение. Возможно ли это?

Ответы

Ответ 1

Насколько я знаю, вы не можете. Но вы можете помочь с этим:

  class A {
    var isMemberSet = false
    lazy val member = { isMemberSet = true; 8 }
  }

  val a = new A
  a.isMemberSet // false
  a.member // 8
  a.isMemberSet // true

Конечно, модификатор видимости и доступа должен быть адаптирован.

Ответ 2

Если вы хотите получить прямой доступ к генерируемому компилятором полем, попробуйте следующий код.

import java.lang.reflect._

class A {
  lazy val member = 42
  def isEvaluated = 
    (1 & getClass.getField("bitmap$0").get(this).asInstanceOf[Int]) == 1
}

val a = new A
println(a.isEvaluated) // => true
println(a.member)
println(a.isEvaluated) // => false

Ответ 3

Я также счел полезным проверить, действительно ли ленивое значение оценивается в некоторых сложных ситуациях.
И это общий класс, который вы могли бы использовать:

class ExtraLazy[T](notYetEvaluatedValue: => T) {
  var isSet = false;
  lazy val value: T = {
    Logger("lazy value being evaluated");
    isSet = true;
    notYetEvaluatedValue;
  }
}