Могу ли я проверить, был ли ленивый вал оценен в Scala? - PullRequest
15 голосов
/ 16 апреля 2011

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

Ответы [ 3 ]

14 голосов
/ 16 апреля 2011

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

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

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

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

8 голосов
/ 16 апреля 2011

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

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
2 голосов
/ 11 февраля 2013

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

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