自有价值的矛盾 "missing lifetime specifier" 错误

Contradictory "missing lifetime specifier" error on owned value

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

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

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

我认为 parent 属性上的生命周期参数和 new 函数中的 parent 参数清楚地表明对 [=16 的引用背后的值=] 必须至少与持有引用的子节点一样长。

但是,编译器给了我两个“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

这里我希望编译器假定 return 值必须至少与 '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 才有可能,如果是,为什么?

您对节点的定义是

struct Node<'a>

但后来你不再提供那个生命周期了。您的 new 签名必须类似于

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

与您的结构定义相同

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