我可以检查 Scala 中是否已计算惰性 val 吗?

发布于 2024-11-01 21:33:33 字数 67 浏览 2 评论 0原文

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

For instance, in a toString method, I would like to give info on whether a lazy val member of a class has been evaluated, and if so, print its value. Is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

白鸥掠海 2024-11-08 21:33:33

据我所知,你不能。但你可以提供帮助:

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

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

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

As far as I know, you can´t. But you can help with that:

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

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

Of course, visibility and access modifier have to be adapted.

也只是曾经 2024-11-08 21:33:33

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

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

If you want direct access to the compiler generated field, please try the following code.

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
李白 2024-11-08 21:33:33

我还发现检查惰性值是否确实在某些棘手的情况下被评估很有用。
这是一个您可以使用的通用类:

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

I have also found it useful to check if the lazy value is in fact evaluated in some tricky situations.
And this is a generic class you could use:

class ExtraLazy[T](notYetEvaluatedValue: => T) {
  var isSet = false;
  lazy val value: T = {
    Logger("lazy value being evaluated");
    isSet = true;
    notYetEvaluatedValue;
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文