E0277"大小不适用于类型[u8]",但我的类型没有[u8]

时间:2016-02-09 15:51:57

标签: rust

我正在制作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。它可能是什么?

1 个答案:

答案 0 :(得分:5)

问题是,您的NodeType枚举在其Include变体中包含std::path::Path,但Path是未归类的类型(因为它包含[u8]间接地,[u8]未被确定,因此你得到的错误。)

要解决此问题,请更改Include变体以包含&Path(如果节点应借用路径)或PathBuf(如果节点应拥有路径),或者更改Node::new()以返回Box<Node>

Include更改为包含&Path需要将生命周期参数添加到NodeNodeType。当枚举不是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) }
    }
}