拥有价值上的“缺少生命周期说明符”错误

时间:2018-12-11 08:13:32

标签: rust lifetime

我编写了代码来建模以下结构,其中一个节点引用了其父节点:

struct Node<'a> {
    parent: &'a Node,
}

impl<'a> Node<'a> {
    fn new(parent: &'a Node) -> Node {
        Node { parent }
    }
}

我认为使用parent属性上的生命周期参数和parent函数中new参数上的lifetime参数可以很清楚地看出,对parent的引用后面的值必须至少与持有引用的子节点一样长。

但是,编译器给了我两条“ missing lifetime specifier”消息。

error[E0106]: missing lifetime specifier
 --> src/main.rs:2:17
  |
7 |     parent: &'a Node,
  |                 ^^^^ expected lifetime parameter

该属性上的个生存期参数。编译器在这里向我要什么?

error[E0106]: missing lifetime specifier
 --> src/main.rs:6:33
  |
6 |     fn new(parent: &'a Node) -> Node {
  |                                 ^^^^ expected lifetime parameter

在这里,我希望编译器假定返回值的生存期至少应与'a一样长。显然不是。我认为用生命周期参数注释拥有的值在语法上是不可能的(因为不必要)。但是编译器似乎仍然希望在这里安装一个,因此我给出了它的要求。

// --snip
fn new(parent: &'a Node) -> 'a Node {
// --snip

当我尝试编译它时,第二个错误变成了另一个错误:

error: expected type, found `'a`
 --> src/main.rs:6:33
  |
6 |     fn new(parent: &'a Node) -> 'a Node {
  |                                 ^^

因此,现在编译器告诉我,这里不希望使用生命周期参数,这似乎与以前的消息矛盾。
如何在节点引用其父节点(其寿命至少与子节点本身一样长)的情况下正确表达此结构?只能使用Rc吗?如果可以,为什么?

1 个答案:

答案 0 :(得分:4)

您对节点的定义是

struct Node<'a>

,但是以后您将不再提供该生命。您的new签名必须看起来像

fn new(parent: &'a Node) -> Node<'a>;

与您的结构定义相同

struct Node<'a> {
    parent: &'a Node<'a>,
}