递归类型和数组

Recursive types and arrays

好的,所以我才刚刚开始学习一点 Rust,我 运行 是一个非常简单的问题。我有这样的递归类型:

struct Tree {
    root : i32,
    children : Box<[Option<Tree> ; 100]>
}

稍后,当我尝试初始化 Tree 时

hex.rs:30:29: 30:40 error: the trait `core::marker::Copy` is not implemented for the type `Tree` [E0277]
hex.rs:30         children : Box::new([None; 100])
                                      ^~~~~~~~~~~
error: aborting due to previous error

所以,我添加了

#[derive(Copy)]

在结构定义之前,但我得到了这个错误:

hex.rs:8:10: 8:14 error: the trait `Copy` may not be implemented for this type; field `children` does not implement `Copy` [E0204]
hex.rs:8 #[derive(Copy)]
                  ^~~~
note: in expansion of #[derive]
hex.rs:8:1: 8:16 note: expansion site
error: aborting due to previous error

我不完全确定从这里到哪里去。是否有一种简单的方法来导出递归数据类型的特征?

问题是Box doesn't support Copy。复制状态:

Types that can be copied by simply copying bits

但是,Box包含指向内存的指针,当您只复制指针的位时,不会复制该内存。

当你构造你的数组时,Rust 只知道你要在里面放一个 Option。没有办法让枚举仅半实现特征。

是否需要使用固定大小的数组?也许这样会更好:

struct Tree {
    root : i32,
    children : Vec<Tree>
}

您的构造函数然后可以使用 Vec::with_capacity:

impl Tree {
    fn new(root: i32) -> Tree {
        Tree { root: root, children: Vec::with_capacity(100) }
    }
}

恐怕如果没有 unsafe,您将无法使用静态数组和类似的递归类型。原因是数组初始值设定项要求数组元素类型为 Copy 因为它们使用初始元素的按字节副本初始化所有元素,而您的类型不能是 Copy 因为它包含 Box,这是在 Rust 中允许递归类型的唯一安全方式(好吧,还有 Vec 和其他类似的容器,但它们也需要堆分配)。

如果你不怕分配,你也可以使用Vec:

struct Tree {
    root: i32,
    children: Vec<Tree>
}

然后初始化看起来像

Tree {
    root: 0,
    children: vec![]
}