递归类型和数组
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![]
}
好的,所以我才刚刚开始学习一点 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![]
}