这有可能在 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)
此代码导致 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)