前言
迭代器是 Rust 中的重要功能之一,在 Rust 中迭代器指的是实现了 Iterator trait 的类型。本文以最短篇幅囊括迭代器的相关知识点。
实现 Interator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
extern crate hello_rust;
struct Counter {
num: i32,
}
impl Iterator for Counter {
type Item = i32;
fn next(&mut self) -> Option<Self::Item> {
if self.num < 6 {
self.num += 1;
Some(self.num)
} else {
None
}
}
}
fn main() {
let c = Counter { num: 0 };
for n in c {
println!("{}", n);
}
println!("end!");
}
|
迭代器的组合
Rust 迭代器的一个重要特性就是可以组合的:
1
2
3
4
5
6
7
8
9
10
11
|
fn main() {
let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
v.iter()
.take(5)
.filter(|&x| x % 2 == 0)
.map(|&x| x * x)
.for_each(|x| println!("{}", x));
println!("end!");
}
|
如此写法除了可读性较高以外还有对并行计算友好的优点(详细的可参考 Rust 各种并行库)。
惰性求值
Rust 迭代器的另一个特性就是惰性求值:
1
2
|
let v = vec![1,2,3,4,5];
v.iter().map(|x| println!("{}", x));
|
上面的代码并不会打印任何东西,因为想要迭代器运行需要消费数据的操作,例如 v.iter().map(...).for_each(|x| println!("{}", x))
;