scala - 具有案例类的双向引用

标签 scala case-class

是否可以在案例类中实现双向树。这似乎很容易,但是我很困惑

case class Node(name:String, parent:Option[Node], children:List[Node])

我想添加一个 child (并获得新的根)-类似
def addChild(n:String):Node = {
  Node(name, parent, Node(n, Some(this), Nil)::children)
}

但这不起作用,因为子级中的“父级”将不再引用将子级列为子级的Node。对于不可变的列表和案例类,这可能吗?

根据以下给出的答案
case class Node(name: String, parent: () => Option[Node], children: List[Node]) {
  def makeChild(name: String) = {
    lazy val newParent:Node = Node(this.name, this.parent, kid :: this.children)
    lazy val kid:Node = Node(name, () => Some(newParent), Nil)
    newParent
  }
}

最佳答案

我最近在Twitter上向@jamesiry提出了同样的问题:-)。

他的回答:

sealed abstract class Tree[T]
case class Node[T](left : Tree[T], right : Tree[T]) extends Tree[T]
case class Leaf[T](value : T, parent : () => Tree[T]) extends Tree[T]

def make = {
   lazy val root = Node(left, right)
   lazy val left : Leaf[Int] = Leaf(1, () => root)
   lazy val right : Leaf[Int] = Leaf(2, () => root)
   root
}

关于scala - 具有案例类的双向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730290/

相关文章:

scala - 在 Scala 中初始化一个二维(多维)数组

scala - 无法处理 future 失败的异常

serialization - 在 Scalding 中读写案例类

scala 使用反射检查是否至少有一个案例类字段值是非空的

scala - 从 Scala 中的 Some 中检索值

scala - Scala 类型系统的优点

json - Scala Play Json 读取

scala - Intellij安装程序Scala和Spark

scala 将 Array[String] 转换为 case 类

scala - 案例类中的产品继承