当 &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>>,
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e246ef19b9ae5f1d405bde7c59d456d7

我明白了

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 上工作(有额外的测试)。