环境
- Time 2022-05-21
- Rust 1.61.0
前言
说明
参考:https://doc.rust-lang.org/std/iter/trait.IntoIterator.html
目标
前一节自定义了一个类型来实现迭代器,并且自定义了一个方法来转化成迭代器。标准库中提供了一个转化成迭代器 trait
。
自定义类型
struct MyData {
value1: usize,
value2: usize,
value3: usize,
value4: usize,
}
Default
impl Default for MyData {
fn default() -> Self {
Self {
value1: 88,
value2: 44,
value3: 66,
value4: 22,
}
}
}
实现迭代器
#[derive(Debug)]
struct MyIterator(Vec<usize>);
impl Iterator for MyIterator {
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
self.0.pop()
}
}
生成迭代器
impl IntoIterator for MyData {
type Item = usize;
type IntoIter = MyIterator;
fn into_iter(self) -> Self::IntoIter {
let vec = vec![self.value4, self.value3, self.value2, self.value1];
MyIterator(vec)
}
}
使用迭代器
fn main() {
let mut iter = MyData::default().into_iter();
while let Some(value) = iter.next() {
println!("value: {value:?}")
}
println!("{iter:?}")
}
for 语法糖
因为实现了 IntoIterator
trait 的可以直接使用 for 遍历,所以可以简写。
fn main() {
for value in MyData::default() {
println!("value: {value:?}")
}
}
for 去糖后
fn main() {
let result = match IntoIterator::into_iter(MyData::default()) {
mut iter => loop {
let next;
match iter.next() {
Some(val) => next = val,
None => break,
};
let x = next;
let () = {
println!("value: {}", x);
};
},
};
result
}
总结
实现了 IntoIterator
trait,并且使用了 for
语法糖。