【问题标题】:Define recursive references - lazy val causes stack overflow定义递归引用——lazy val 导致栈溢出
【发布时间】:2023-03-09 09:18:01
【问题描述】:

对于数据流场景,我需要递归地相互引用的值。以下不起作用:

class Foo(val that: Foo)

class Bar {
  lazy val a: Foo = new Foo(b)
  lazy val b: Foo = new Foo(a)
  println(s"a = $a, b = $b")
}

new Bar  // boom!

如何在不弄脏var 的情况下解决这个问题?

【问题讨论】:

  • 您将如何使用var 解决这个问题?
  • @Noah,我认为他的意思是 var 内部 Foo
  • 是的,class Foo(var that: Foo); val a = new Foo(null); val b = new Foo(a); a.foo = b

标签: scala recursion lazy-evaluation


【解决方案1】:

你只是需要更多的懒惰!

class Foo(_that: => Foo){ lazy val that = _that }


class Bar {
  lazy val a: Foo = new Foo(b)
  lazy val b: Foo = new Foo(a)
  println(s"a = $a, b = $b")
}

val bar = new Bar

bar.b.that eq bar.a
// true

bar.b eq bar.a.that
// true

【讨论】:

    【解决方案2】:

    您可以使用一个按名称参数和另一个lazy val

    class Foo(_that: => Foo) {
      lazy val that = _that
    }
    
    class Bar {
      lazy val a: Foo = new Foo(b)
      lazy val b: Foo = new Foo(a)
      println(s"a = $a, b = $b")
    }
    
    val bar = new Bar()
    println(bar.a.that)
    

    by name 参数推迟对另一个Foo 的引用的评估。一旦你访问that,两个Foos 都已创建,所以你没问题。

    【讨论】:

    • 谢谢,你和Senia的回答是一样的,不好意思只能采纳一个。
    • NP。他比我快了几秒钟:)
    猜你喜欢
    • 2015-12-21
    • 2020-12-17
    • 2011-02-26
    • 1970-01-01
    • 2018-10-29
    • 2013-04-05
    相关资源
    最近更新 更多