gpt4 book ai didi

immutability - Kotlin 中带有 val 的循环引用

转载 作者:行者123 更新时间:2023-12-04 04:54:44 24 4
gpt4 key购买 nike

在 Kotlin 中,假设我有 data class A (val f: B)data class B (val f: A) .我要初始化本地var a: Avar b: B这样a.fbb.fa . A.fB.f必须保持 vals。这种循环实例化可能吗?

data class A(val f: B)

data class B(val f: A)

fun foo() {
var a: A
var b: B
// instantiate a and b here with a.f == b and b.f == a ??
}

最佳答案

如果你明确声明你的自我引用,你可以这样做 valLazy :

sealed class MyData {
data class A(val x: Int) : MyData()
data class B(val x : Int, val rb: Lazy<MyData>) : MyData() {
val r: MyData by rb
}
}

fun <A : Any> rec(body: (Lazy<A>) -> A): A {
lateinit var a: A
a = body(lazy { a })
return a
}

fun MyData.print(gas: Int): String = if (gas <= 0) "..." else
when(this) {
is MyData.A -> "A(x=$x)"
is MyData.B -> {
val rbString =
if (rb.isInitialized())
r.print(gas - 1)
else
"<thunk>"
"B(x=$x, rb=$rbString)"
}
}

fun main() {
val a = MyData.A(42)
val b1 = MyData.B(1, lazy { a })
println(b1.r) // Force value
println(b1)
val b2 = rec<MyData.B> { b2 -> MyData.B(1, b2) }
println(b2.r.print(4))
}

这打印
A(x=42)
B(x=1, rb=A(x=42))
B(x=1, rb=B(x=1, rb=B(x=1, rb=B(x=1, rb=...))))

关于immutability - Kotlin 中带有 val 的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35439421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com