为什么包含 Box 的枚举类型不具备可复制性?

3

盒子和数组是可复制的,为什么这段代码无法编译?

#[derive(Debug, Copy, Clone)]
enum Octree{
    Branch(Box<[Octree; 8]>),
    Filled,
    Empty,
}

编译错误:

main.rs:3:17: 3:21 error: the trait `Copy` may not be implemented for this type; variant `Branch` does not implement `Copy` [E0205]

编辑: 好的,我不想让Octree可复制。但是我怎么才能使其可变呢?我想要能够更改节点的子项。


2
我不熟悉 Rust,但是错误信息暗示 Branch 不可复制,因此枚举也是如此。 - OMGtechy
是的,问题出在Branch上。我现在有一个理论,为什么它不起作用:对树的根进行浅拷贝会导致别名问题。但我无法弄清楚如何解决这个问题。如果没有复制,例如我就不能用Empy填充数组。 - Joonazan
1
@Joonazan: [Octtree::Empty, Octtree::Empty, Octtree::Empty, Octtree::Empty, Octtree::Empty, Octtree::Empty, Octtree::Empty, Octtree::Empty]。问题解决了。(是的,我对此非常认真。如果您想使用数组,那就是您要做的。) - Chris Morgan
@ChrisMorgan:不是很方便。例如,在Go中,您可以创建所需大小的数组,然后填充它。Rust需要一种可以被填充一次的不可变数组。 - Joonazan
1个回答

6

复制只适用于可以轻松复制的类型。 Box不是Copy,因为仅复制指针将违反单一所有权原则。

你应该在这里使用Clone及其clone方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接