初面网初面网

迭代器

用于对集合(如数组、向量、链表等)进行逐步访问和操作。核心思想是将数据处理过程与数据本身分离,使代码更清晰、更易读、更易维护。

在 Rust 中,迭代器通过实现 Iterator trait 来定义。

Iterator trait

trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
}

创建迭代器

通过集合的.iter().iter_mut().into_iter() 等方法创建迭代器。

// 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(), 为每个元素提供索引

例如:

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(), 计算迭代器中元素的数量

例如:

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 的类型都可以在不同的上下文中作为迭代器使用。

更新于 2026/3/9