迭代器
迭代器是一个值,它可以生成一系列值
Iterrator 类型和 IntoIterator类型
- 迭代器是实现了Iterator类型的任意值
- IntoIterator是迭代器本身类型,Item是它生成的值的类型。
- 任意实现了IntoIterator的类型都可以成为可迭代者,可以通过into_iter获得一个迭代器
- 迭代器能生成值
- 迭代器生成的值是Item(条目)
- 接收迭代器条目的代码是消费者
- 大多数集合提供了iter和iter_mut方法,会返回该类型的迭代器,为每个条目生成共享引用或可变引用
-
给一个集合的共享引用,into_iter会返回一个条目的共享引用
-
给一个集合的可变引用,into_iter会返回一个条目的可变引用
-
当按值传递集合,into_iter会返回一个迭代器,获得集合的所有权,按值返回。这些值的所有权会传递给消费者,在迭代过程中消耗掉。
-
并非所有类型都提供了这3种实现,HashSet,BTreaSet,BinaryHeap不会在可变引用上实现IntoIterator,修改元素会破坏自身不变性规则-修改后的值可能有不同的hash。
from_fn 和 successors
from_fn:给定返回Option
successors:如果每个条目依赖前一个条目,std::iter::successors比较适合。提供一个初始条件和一个函数,且该函数能接受一个条目并返回下一个条目的Option。如果返回None则结束。
from_fn与successors都接受FnMut闭包
fn fibonacci() - > impl Iterator <Item=usize>{
let mut sate = (0,1);
std::iter::from_fn(move ||{
state = (state.1, state.0 + state.1);
Some(state.0)
})
}
assert_eq!(fibonacci().take(8).collect::<Vec<_>>(),
vec![1,1,2,3,5,8,13,21]);
from_fn successors 方法非常灵活,你可以将任何对迭代器的使用用它们来改写。
在使用这两个方法前,请确保你了解其他的迭代器不是最优的选择。
drain
许多集合提供了drain方法(抽取方法)。drain会接受一个对集合的可变引用,返回一个迭代器,将每个元素的所有权传给消费者。
与into_iter不同,drain只会借入对集合的可变引用,当迭代器丢弃时,它会从集合中移除所有剩余元素以清空集合。