如何在 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 的回答中的递归操作。
我有这个树结构
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 的回答中的递归操作。