迭代器 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 已经变成未初始化的了, 接下来无法再使用它. }