如何在 Scala 中复制一个对象?

How to copy an object in Scala?

我有这个树结构

sealed trait Tree
case class Node(var left: Tree, var right: Tree, var value: String) extends Tree
case object EmptyNode extends Tree

和一个名为 myTree 的树对象。我想制作另一棵具有完全相同结构和值的树,称为 otherTree,但 myTree.clone() 不起作用。我还能做什么?

类似这样的内容会复制您的 Tree:

  def copyTree(t:Tree):Tree = {
    t match {
      case EmptyNode => EmptyNode
      case Node(left, right, value) => Node(copyTree(left), copyTree(right), value)
    }
  }

只是为了完整性 - 因为问题要求 'How to copy...' 并且您提到了 clone():您可以使用 copy() 方法复制 case 类。然而,它对可变的树结构没有帮助。但是具有不可变的结构(如 Gregor 上面所建议的),例如像这样

sealed trait Tree
case class Node(left: Tree, right: Tree, value: String) extends Tree
case object EmptyNode extends Tree { override def toString = " _ " }

和一些数据

scala> val leaf1 = Node(EmptyNode, EmptyNode, "leaf1")
scala> val leaf2 = Node(EmptyNode, EmptyNode, "leaf2")
scala> val tree1 = Node(leaf1, leaf2, "tree1")
scala> tree1
res0: Node = Node(Node( _ , _ ,leaf1),Node( _ , _ ,leaf2),tree1)

你可以像这样复制你的树

scala> val tree2 = tree1.copy(value = "tree2")
tree2: Node = Node(Node( _ , _ ,leaf1),Node( _ , _ ,leaf2),tree2)

scala> val tree3 = Node(tree1.left, tree1.right, "tree3")
tree3: Node = Node(Node( _ , _ ,leaf1),Node( _ , _ ,leaf2),tree3)

与不可变实例一样,对于更新,您需要创建新的树结构,例如使用 Noah 的回答中的递归操作。