当具体类型起作用时,为什么引用同级字段的Iterator特征对象无法编译?

问题描述

我想要一个指向相同结构的Vec的迭代器。

以下方法工作正常(playground):

struct Holder1<'a> {
    vec: Vec<i32>,iterator: Option<Box<std::slice::Iter<'a,i32>>>,}

fn holder1_test() {
    let vec = vec![1,2,3,4];
    let mut holder = Holder1 {
        vec,iterator: None,};
    let iterator: Box<std::slice::Iter<'_,i32>> = Box::new(holder.vec.iter());
    holder.iterator = Some(iterator);

    for iter_elem in holder.iterator.as_mut().unwrap() {
        println!("iter: {}",iter_elem);
    }
}

(我知道这里不需要Box,我只是想使其尽可能靠近下一个代码段。)

我想使用特征对象dyn Iterator而不是具体类型。我已经从上面为(playground修改了示例:

struct Holder2<'a> {
    vec: Vec<i32>,iterator: Option<Box<dyn Iterator<Item = &'a i32>>>,}

fn holder2_test() {
    let vec = vec![1,4];
    let mut holder = Holder2 {
        vec,};
    let iterator: Box<dyn Iterator<Item = &'_ i32>> = Box::new(holder.vec.iter());
    holder.iterator = Some(iterator);

    for iter_elem in holder.iterator.as_mut().unwrap() {
        println!("iter: {}",iter_elem);
    }
}

无法编译:

error[E0597]: `holder.vec` does not live long enough
  --> src/lib.rs:12:64
   |
12 |     let iterator: Box<dyn Iterator<Item = &'_ i32>> = Box::new(holder.vec.iter());
   |                                                                ^^^^^^^^^^ borrowed value does not live long enough
...
18 | }
   | -
   | |
   | `holder.vec` dropped here while still borrowed
   | borrow might be used here,when `holder` is dropped and runs the destructor for type `Holder2<'_>`

第二个示例与导致编译失败的第一个示例有何不同?两个迭代器都指向同一结构的Vec中的元素-那么这里的概念区别是什么?有没有办法使它与特征对象一起使用?

我知道使用索引而不是迭代器可以解决此问题,但是我对为什么此方法不起作用的根本原因很感兴趣。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)