迭代器 Iterators
迭代器模式, 作为一种常用的设计模式, 在 Rust 里也有广泛的应用.
根据维基百科里的定义, 在面向对象的编程中, 迭代器模式是一种用于遍历容器并访问容器的元素的设计模式. 迭代器模式将算法与容器分离; 在某些情况下, 算法必然是特定于容器的, 因此不能解耦.
像 Vec, String, HashMap 等标准库里提供的容器, 对迭代器有很完整的支持.
本章我们将介绍与迭代器相关的几个 traits, 以及如何为自定义的类型实现迭代器模式.
遍历的三种形式
从一个集合创建迭代器, 有三种形式:
iter(), 通过&T遍历, 只读的形式iter_mut(), 通过&mut T遍历, 可以改变它的值into_iter(), 通过T遍历, 发生了所有权的转移
只读引用的形式:
let v = vec![1, 2, 3, 4];
for x in v.iter() {
println!("{x}");
}
可变更引用的形式:
let mut v = vec![1, 2, 3, 4];
for x in v.iter_mut() {
*x += 1;
}
// 或者使用语法糖
for x in &mut v {
*x += 1;
}
发生所有权转移的形式:
let v = vec![1, 2, 3, 4];
for x in v {
println!("{x}");
}
// v 已经变成未初始化的了, 接下来无法再使用它.