自有价值的矛盾 "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>,
}
我编写了代码来模拟以下结构,其中一个节点引用了它的父节点:
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>,
}