【发布时间】: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 才有可能吗?如果可以,为什么?
【问题讨论】: