当 &self 的生命周期与结构不同时
When &self has different lifetime than the struct
在这个例子中
use std::marker::PhantomData;
pub struct A<'a, T> {
elements: Vec<B<'a, T>>
}
pub struct B<'a, T> {
_phantom: PhantomData<&'a T>
}
impl<'a, T> A<'a, T> {
pub fn iter(& self) -> Iter<'a, T> {
Iter {
iter: self.elements.iter(),
}
}
}
pub struct Iter<'a, T> {
iter: std::slice::Iter<'a, B<'a, T>>,
}
我明白了
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
--> src/lib.rs:14:24
|
14 | iter: self.elements.iter(),
| ^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime defined here...
--> src/lib.rs:12:17
//...
我知道为什么会这样:self.elements
中的 elements
和 &self
一样长,所以它不可能创建生命周期为 [=17= 的 Iter
].简单的解决方案是做
pub fn iter(&'a self) -> Iter<'a, T> {
Iter {
iter: self.elements.iter(),
}
}
但后来我不得不借用 &self
的整个存在,这导致我遇到其他问题。这里最简单的解决方案是什么?
您的 Iter
实施过度约束;你有两个不相关的生命周期,它们必须是相同的。你应该把它们分开:
impl<'a, T> A<'a, T> {
pub fn iter(&self) -> Iter<'a, '_, T> {
Iter {
iter: self.elements.iter(),
}
}
}
pub struct Iter<'a, 'b, T> {
iter: std::slice::Iter<'b, B<'a, T>>,
}
这样,即使 'a
不变,您也不会 运行 将生命周期链接到 self
。看到它在 playground 上工作(有额外的测试)。
在这个例子中
use std::marker::PhantomData;
pub struct A<'a, T> {
elements: Vec<B<'a, T>>
}
pub struct B<'a, T> {
_phantom: PhantomData<&'a T>
}
impl<'a, T> A<'a, T> {
pub fn iter(& self) -> Iter<'a, T> {
Iter {
iter: self.elements.iter(),
}
}
}
pub struct Iter<'a, T> {
iter: std::slice::Iter<'a, B<'a, T>>,
}
我明白了
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
--> src/lib.rs:14:24
|
14 | iter: self.elements.iter(),
| ^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime defined here...
--> src/lib.rs:12:17
//...
我知道为什么会这样:self.elements
中的 elements
和 &self
一样长,所以它不可能创建生命周期为 [=17= 的 Iter
].简单的解决方案是做
pub fn iter(&'a self) -> Iter<'a, T> {
Iter {
iter: self.elements.iter(),
}
}
但后来我不得不借用 &self
的整个存在,这导致我遇到其他问题。这里最简单的解决方案是什么?
您的 Iter
实施过度约束;你有两个不相关的生命周期,它们必须是相同的。你应该把它们分开:
impl<'a, T> A<'a, T> {
pub fn iter(&self) -> Iter<'a, '_, T> {
Iter {
iter: self.elements.iter(),
}
}
}
pub struct Iter<'a, 'b, T> {
iter: std::slice::Iter<'b, B<'a, T>>,
}
这样,即使 'a
不变,您也不会 运行 将生命周期链接到 self
。看到它在 playground 上工作(有额外的测试)。