在这个例子中
我知道为什么会发生这种情况:在
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
有相同的生命周期,因此它不可能创建一个具有生命周期a
的Iter
。简单的解决方案是进行以下操作:pub fn iter(&'a self) -> Iter<'a, T> {
Iter {
iter: self.elements.iter(),
}
}
但是我被迫借用&self
来维持其整个生命周期,这会导致其他问题。有什么最简单的解决方案吗?
B
对于'a
是协变的,所以编译器可以将生命周期缩短到仅在需要时而不是整个存在期间,因此我被迫借用&self
的整个存在期并不完全正确。” - kmdreko