如何解决当具体类型起作用时,为什么引用同级字段的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 举报,一经查实,本站将立刻删除。