首页 文章

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

提问于
浏览
15

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

3 回答

  • 2

    我还发现在某些棘手的情况下检查惰性值是否实际上是有用的 .
    这是一个你可以使用的泛型类:

    class ExtraLazy[T](notYetEvaluatedValue: => T) {
      var isSet = false;
      lazy val value: T = {
        Logger("lazy value being evaluated");
        isSet = true;
        notYetEvaluatedValue;
      }
    }
    
  • 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
    

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

  • 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
    

相关问题