这有可能在 Scala 中通过循环依赖实现惰性吗?

Is this possible to implement laziness with circular dependencies in Scala?

此代码导致 Whosebug 错误:

lazy val leftChild = new Node(true, root, Seq(2), Seq())
lazy val rightChild = new Node(true, root, Seq(3), Seq())
lazy val root :Node = new Node(false, null, Seq(1), Seq(leftChild, rightChild))

其中节点定义如下:

case class Node(isLeaf: Boolean, parent: Node,  keys: Seq[Int], pointers: Seq[Node])

一个可能的解决方案是放弃使用 case class。 如何仅使用不可变状态正确实现此结构?这对于 lazy 和 Node 来说可能吗 class?

我认为对按值调用参数的递归调用总是会导致无限初始化循环。解决这个问题的一种方法(正如您所猜到的那样)是放弃 case 类 并添加 parent 以按名称调用。

实现是不可变的,唯一的问题是它不使用大小写类。

 lazy val root: Node  = new Node(false, null, Seq(1), Seq(leftChild, rightChild))
 lazy val leftChild = new Node(true, root, Seq(2), Seq())
 lazy val rightChild = new Node(true, root, Seq(3), Seq())


 class Node(val isLeaf: Boolean, parent: => Node,  val keys: Seq[Int], val pointers: Seq[Node]) {
     def getParent = parent
 }

 println(root)
 println(leftChild.getParent)