Appearance
迭代器
用于对集合(如数组、向量、链表等)进行逐步访问和操作。核心思想是将数据处理过程与数据本身分离,使代码更清晰、更易读、更易维护。
在 Rust 中,迭代器通过实现 Iterator trait 来定义。
Iterator trait
rust
trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}创建迭代器
通过集合的.iter()、.iter_mut()、.into_iter() 等方法创建迭代器。
rust
// vec!宏创建向量
let numbers = vec![1, 2, 3];
let mut iter = numbers.iter();
// 使用iter_mut()方法创建可变借用迭代器
let mut vec = vec![1, 2, 3];
let mut iter_mut = vec.iter_mut();
// 使用into_iter()方法创建所有权转移迭代器
let numbers = vec![1, 2, 3];
let mut iter_owned = numbers.into_iter();
// assert_eq! 测试迭代器的输出
assert_eq!(iter.next(), Some(&1));
assert_eq!(iter.next(), Some(&2));
assert_eq!(iter.next(), Some(&3));
assert_eq!(iter.next(), None);迭代器方法
- map(),对每个元素应用给定的转换函数
- filter(),过滤掉不符合条件的元素,返回符合要求的元素
- fold(),将集合中的元素进行累积处理
- skip(), 跳过指定数量的元素
- enumerate(), 为每个元素提供索引
例如:
rust
let vec = vec![1, 2, 3, 4, 5];
let squared_vec: Vec<i32> = vec.iter().map(|x| x * x).collect();
let vec2 = vec![1, 2, 3, 4, 5];
let filtered_vec: Vec<i32> = vec2.into_iter().filter(|&x| x % 2 == 0).collect();消耗型适配器
使用迭代器直到它被完全消耗。
- collect(),将迭代器转换为集合类型,如 向量 Vec、哈希集 HashMap 等
- sum(), 计算迭代器中所有元素的和
- product(), 计算迭代器中所有元素的乘积
- count(), 计算迭代器中元素的数量
例如:
rust
let v = vec![1, 2, 3];
let sum: i32 = v.iter().sum();
assert_eq!(sum, 6);遵循原则
- 惰性求值(Laziness):迭代器只在需要时才计算下一个元素,避免不必要的计算。
- 所有权和借用检查 (Ownership and Borrowing Checks):Rust 迭代器严格遵守所有权和借用规则,避免数据竞争和内存错误。迭代器的生命周期与底层数据相关联,确保数据的安全访问。
- 链式调用 (Chaining):Rust 迭代器支持链式调用,即可以将多个迭代器方法链接在一起进行组合操作。例如,通过使用 .map()、.filter()、.collect() 等方法,可以创建复杂的数据处理流水线。
- 高效内存管理 (Efficient Memory Management):得益于惰性求值,迭代器避免了不必要的内存分配。
- 抽象和通用性 (Abstraction and Generality):任何实现了 Iterator trait 的类型都可以在不同的上下文中作为迭代器使用。