Rust 为什么编译代码需要这些确切的生命周期?

Rust 为什么编译代码需要这些确切的生命周期?,rust,lifetime,borrow-checker,Rust,Lifetime,Borrow Checker,我正在编写一个解析器,需要迭代器进行前瞻,但不想使用peek特性。相反,我使用了迭代器的包装器。我想出了这样的办法,省去了一切不必要的东西: struct Wrapper<'a> { it: &'a mut Iterator<Item = &'a String>, } pub trait DoSomething { fn do_something(self); } impl<'a, T> DoSomething for T

我正在编写一个解析器,需要迭代器进行前瞻,但不想使用
peek
特性。相反,我使用了迭代器的包装器。我想出了这样的办法,省去了一切不必要的东西:

struct Wrapper<'a> {
    it: &'a mut Iterator<Item = &'a String>,
}

pub trait DoSomething {
    fn do_something(self);
}

impl<'a, T> DoSomething for T
where
    T: IntoIterator<Item = &'a String>,
{
    fn do_something(self) {
        let mut it = self.into_iter();
        let throwaway = Wrapper { it: &mut it };
    }
}
我也不明白为什么
it
的寿命不够长,因为解除分配顺序应该是
throwaway
然后
it
。使用第二个生命周期
'b
也不起作用,无论是使用
'a:'b
还是使用
'b:'a
(我很沮丧,只是尝试了各种组合)

唯一有帮助的是分离迭代器引用及其包含的引用的生存期并将它们关联起来(无需指定
T::IntoIter
)的生存期:

结构包装器&mut迭代器{
它:&'i mut IteratorGot;什么时候像
T::IntoIter:'a
这样的东西是必要的?
struct Wrapper<'a, 'b: 'a> {
    it: &'a mut Iterator<Item = &'b String>,
}
struct Wrapper<'i, 's: 'i> {
    it: &'i mut Iterator<Item = &'s String>,
}