对于数据流场景,我需要以递归方式相互引用的值。以下不起作用:
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
来弄脏我怎么解决这个问题?
答案 0 :(得分:8)
你只需要更多的懒惰!
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
答案 1 :(得分:5)
您可以使用by name参数和另一个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
后,两个Foo
都已创建,所以您没问题。