【问题标题】:Contradictory "missing lifetime specifier" error on owned value [duplicate]拥有值的矛盾“缺少生命周期说明符”错误[重复]
【发布时间】:2018-12-11 08:13:32
【问题描述】:

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

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

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

我认为使用 parent 属性和 new 函数中的 parent 参数上的生命周期参数可以清楚地表明,对 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 才有可能吗?如果可以,为什么?

【问题讨论】:

    标签: rust lifetime


    【解决方案1】:

    你对节点的定义是

    struct Node<'a>
    

    但后来你不再提供那个生命周期了。你的new 签名必须是这样的

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

    与您的结构定义相同

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

    【讨论】:

    • 啊,谢谢,这行得通。但我仍然不明白为什么尖括号中必须有一个生命周期参数。 &Node、&'a Node 和 &'a Node 有什么区别。尖括号中的生命周期参数是否必须满足类型的名称或它意味着什么?
    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多