我正在制作Node
树。这是代码:
use std::option::Option;
use std::path;
#[derive(Debug)]
enum NodeType {
Binding((String, String)),
Header,
Include(path::Path),
Raw(String),
}
#[derive(Debug)]
pub struct Node {
node_type: NodeType,
}
impl Node {
fn new() -> Node {
Node { node_type: NodeType::Header }
}
}
编译时,我收到以下错误:
error[E0277]: the trait bound `[u8]: std::marker::Sized` is not satisfied in `std::path::Path`
--> src/main.rs:8:13
|
8 | Include(path::Path),
| ^^^^^^^^^^^ within `std::path::Path`, the trait `std::marker::Sized` is not implemented for `[u8]`
|
= note: `[u8]` does not have a constant size known at compile-time
= note: required because it appears within the type `std::path::Path`
= note: only the last field of a struct may have a dynamically sized type
我搜索了这个错误,但似乎是指未实现Sized
的类型。奇怪的是,错误输出表明[u8]
没有实现Sized
,但我的代码中甚至没有u8
。它可能是什么?
答案 0 :(得分:5)
问题是,您的NodeType
枚举在其Include
变体中包含std::path::Path
,但Path
是未归类的类型(因为它包含[u8]
间接地,[u8]
未被确定,因此你得到的错误。)
要解决此问题,请更改Include
变体以包含&Path
(如果节点应借用路径)或PathBuf
(如果节点应拥有路径),或者更改Node::new()
以返回Box<Node>
。
将Include
更改为包含&Path
需要将生命周期参数添加到Node
和NodeType
。当枚举不是Include
时,具体的生命周期可能是静态的。
下面的代码演示了这是如何工作的。请注意impl
有两个Node
块:第一个(impl Node<'static>
)应包含所有不使用lifetime参数的方法,而第二个(impl<'a> Node<'a>
})应该包含所有使用lifetime参数的方法(包括所有带self
参数的方法)。
use std::path;
#[derive(Debug)]
enum NodeType<'a> {
Binding((String, String)),
Header,
Include(&'a path::Path),
Raw(String),
}
#[derive(Debug)]
pub struct Node<'a> {
node_type: NodeType<'a>,
}
impl Node<'static> {
fn new() -> Node<'static> {
Node { node_type: NodeType::Header }
}
}
impl<'a> Node<'a> {
fn include(path: &'a path::Path) -> Node<'a> {
Node { node_type: NodeType::Include(path) }
}
}