迭代器 Iterators

迭代器模式, 作为一种常用的设计模式, 在 Rust 里也有广泛的应用.

根据维基百科里的定义, 在面向对象的编程中, 迭代器模式是一种用于遍历容器并访问容器的元素的设计模式. 迭代器模式将算法与容器分离; 在某些情况下, 算法必然是特定于容器的, 因此不能解耦.

Vec, String, HashMap 等标准库里提供的容器, 对迭代器有很完整的支持. 本章我们将介绍与迭代器相关的几个 traits, 以及如何为自定义的类型实现迭代器模式.

遍历的三种形式

从一个集合创建迭代器, 有三种形式:

  • iter(), 通过 &T 遍历, 只读的形式
  • iter_mut(), 通过 &mut T 遍历, 可以改变它的值
  • into_iter(), 通过 T 遍历, 发生了所有权的转移

只读引用的形式:

#![allow(unused)]
fn main() {
let v = vec![1, 2, 3, 4];
for x in v.iter() {
  println!("{x}");
}
}

可变更引用的形式:

#![allow(unused)]
fn main() {
let mut v = vec![1, 2, 3, 4];
for x in v.iter_mut() {
  *x += 1;
}

// 或者使用语法糖
for x in &mut v {
  *x += 1;
}
}

发生所有权转移的形式:

#![allow(unused)]
fn main() {
let v = vec![1, 2, 3, 4];
for x in v {
  println!("{x}");
}
// v 已经变成未初始化的了, 接下来无法再使用它.
}

相关知识