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

Jea*_*let 15 scala lazy-evaluation

例如,在一个toString方法中,我想提供关于是否已经评估了类的惰性val成员的信息,如果是,则打印其值.这可能吗?

Pet*_*itz 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
Run Code Online (Sandbox Code Playgroud)

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

  • +1很好,但它重复了编译器生成的"运行时"所做的工作,我试图直接访问它. (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

  • ......而且,有趣的是,为第二个懒惰的val测试的魔法常数不是2而是4 :-)重新排序成员并观察它的分解......谁知道,改变了类层次结构,它因为改变而中断父母的懒惰数量? (6认同)