pub struct IterOverVecVec<'a> {
m: &'a dyn IterTrait,
}
impl<'a> Iterator for IterOverVecVec<'a> {
type Item = u16;
fn next(&mut self) -> Option<Self::Item> {
Some(1)
}
}
impl<'a> IterOverVecVec<'a> {
fn new(m: &'a dyn IterTrait) -> Self {
Self { m }
}
}
pub trait IterTrait {}
impl<'b> dyn IterTrait {
pub fn get_iter<'a>(&'a self) -> IterOverVecVec<'a> {
IterOverVecVec::new(self)
}
}
pub struct HasAVec<'a> {
m: &'a Vec<Vec<u16>>,
}
impl<'a> IterTrait for HasAVec<'a> {}
impl<'a> HasAVec<'a> {
pub fn new(m: &'a Vec<Vec<u16>>) -> Self {
Self { m }
}
}
#[test]
fn fails() {
let vecvec: Vec<Vec<u16>> = vec![vec![1, 2, 3], vec![4, 5, 6]];
let struct_with_vecs = HasAVec::new(&vecvec);
let ni = <dyn IterTrait>::get_iter(&struct_with_vecs);
}
error[E0597]: `vecvec` does not live long enough
--> src/lib.rs:41:41
|
41 | let struct_with_vecs = HasAVec::new(&vecvec);
| ^^^^^^^ borrowed value does not live long enough
42 | let ni = <dyn IterTrait>::get_iter(&struct_with_vecs);
| ----------------- cast requires that `vecvec` is borrowed for `'static`
43 | }
| - `vecvec` dropped here while still borrowed
游乐场链接:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=5d7b88a4a261821fabfd0228e8ef8b2c
我对根本原因的理解是:在struct_with_vecs
被转换为第33行上的trait类型之后,编译器试图推断它的(新?)生命周期并以某种方式到达'static
,并且由于我没有正确的生命周期注释,它出错了。
我发现最接近我的问题是一个Rust论坛线程(https://users.rust-lang.org/t/argument-requires-that-is-borrowed-for-static/66503/2),如果我理解正确的话,它说在这种情况下,Rust试图应用尽可能长的生命周期。但是,我无法将该问题的解决方案应用于我的问题,因为在我看来,这是由我不使用的闭包引起的。
所以我的问题是,我如何利用IterTrait::get_iter()
而不让vecvec
被'static
借用?
rustc到达'static
是因为dyn Trait
是dyn Trait + 'static
。为了允许其他生命周期,您应该使用dyn Trait + 'lifetime
或dyn Trait + '_
来省略生命周期。
如果你替换
impl dyn IterTrait {
impl dyn IterTrait + '_ {
然后它工作(操场)。