问题描述
我想要一个指向相同结构的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 (将#修改为@)