我编写了代码来建模以下结构,其中一个节点引用了其父节点:
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
吗?如果可以,为什么?
答案 0 :(得分:4)
您对节点的定义是
struct Node<'a>
,但是以后您将不再提供该生命。您的new
签名必须看起来像
fn new(parent: &'a Node) -> Node<'a>;
与您的结构定义相同
struct Node<'a> {
parent: &'a Node<'a>,
}