进一步深化实施示范IntoIterator
对于包裹向量铁锈书 https://doc.rust-lang.org/std/iter/trait.IntoIterator.html,我也在努力实现 IntoIterator 供参考到包装纸,按照:
struct VecWrapper(Vec<i32>);
impl VecWrapper {
fn iter(&'static self) -> Iter {
Iter(Box::new(self.0.iter()))
}
}
struct Iter(Box<Iterator<Item = &'static i32>>);
impl Iterator for Iter {
type Item = &'static i32;
fn next(&mut self) -> Option<Self::Item> {
self.0.next()
}
}
impl IntoIterator for &'static VecWrapper {
type Item = &'static i32;
type IntoIter = Iter;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
fn main() {
// let test = vec![1, 2, 3]; // obviously, works
let test = VecWrapper(vec![1, 2, 3]); // not working
for v in &test {
println!("{}", v);
}
}
尽管实现可以编译,但尝试在main
没有出现以下错误:
error[E0597]: `test` does not live long enough
--> src/main.rs:31:14
|
31 | for v in &test {
| ^^^^^
| |
| borrowed value does not live long enough
| argument requires that `test` is borrowed for `'static`
...
34 | }
| - `test` dropped here while still borrowed
这段代码大大简化了我实际想要使用的内容,仅使用'static
生命周期,使用现有的包含类型,并使用i32
对于内部(迭代)类型,但它被归结为仅显示问题。
接受的答案解决了问题的第一部分,即不使用'static
并使用+ 'a
有特点。我对实际代码仍然有疑问,这是一个LazyList
执行。我已将其发布为我是否错误地实现了 IntoIterator 以引用 LazyList 实现,或者这是一个 Rust bug? https://stackoverflow.com/questions/40687955/am-i-incorrectly-implementing-intoiterator-for-a-reference-to-a-lazylist-impleme.