我可以检查是否已在Scala中评估了惰性val吗?

时间:2011-04-16 07:34:22

标签: scala lazy-evaluation

例如,在toString方法中,我想提供有关是否已对类的惰性val成员进行求值的信息,如果是,则打印其值。这可能吗?

3 个答案:

答案 0 :(得分:14)

据我所知,你不能。但你可以帮忙解决这个问题:

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

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

当然,必须调整可见性和访问修饰符。

答案 1 :(得分:8)

如果要直接访问编译器生成的字段,请尝试以下代码。

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 :(得分:2)

我还发现检查惰性值是否在某些棘手的情况下进行评估是有用的 这是一个你可以使用的通用类:

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