强制转换要求变量借用为"静态"


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 Traitdyn Trait + 'static。为了允许其他生命周期,您应该使用dyn Trait + 'lifetimedyn Trait + '_来省略生命周期。

如果你替换

impl dyn IterTrait {

impl dyn IterTrait + '_ {

然后它工作(操场)。

相关内容

  • 没有找到相关文章

最新更新