rust中的迭代器
迭代器模式,就是指对一系列项执行某些任务。
一、迭代器的作用
迭代器(iterator)负责:
1、遍历每个项
2、确定序列遍历何时完成
在标准库中没有提供迭代器的语言中,我们可能会使用一个从 0 开始的索引变量,使用这个变量索引 vector 中的值,并循环增加其值直到达到 vector 的元素数量。迭代器为我们处理了所有这些逻辑,这减少了重复代码并消除了潜在的混乱。另外,迭代器的实现方式提供了对多种不同的序列使用相同逻辑的灵活性,而不仅仅是像 vector 这样可索引的数据结构。
首先要注意的是,rust中的迭代器是惰性的,即除非你去调用消耗迭代器的方法,否则迭代器本身没有任何效果。
如下面一个使用迭代器的例子:

当我们创建迭代器没有用它的时候,这段代码并没有任何用处:
let v1_iter = v1.iter();
即迭代器被储存在 v1_iter变量中,而这时没有进行迭代。
一旦 for 循环开始使用 v1_iter,迭代器才发生作用。
二、迭代器的实现
1、Iterator trait和next方法
迭代器都实现了一个叫做 Iterator 的定义于标准库的 trait。

注意这里有一下我们还未讲到的新语法: type Item 和 Self::Item ,他们定义了 trait 的 关联类型(associated type)。现在只需知道这段代码表明实现 Iterator trait 要求同时定义一个 Item 类型,这个 Item 类型被用作 next 方法的返回值类型。换句话说,Item 类型将是迭代器返回元素的类型。
next 是 Iterator 实现者被要求定义的唯一方法。 next 一次返回迭代器中的一个项,封装在 Some 中,当迭代器结束时,它返回 None 。迭代器中的next方法也可以直接调用,如下:

2、消费迭代器的方法
Iterator trait 有一系列不同的由标准库提供默认实现的方法;你可以在 Iterator trait 的标准库 API 文档中找到所有这些方法。一些方法在其定义中调用了 next 方法,这也就是为什么在实现 Iterator trait 时要求实现 next 方法的原因。这些调用 next 方法的方法被称为 消费适配器(consuming adaptors),因为调用他们会消耗迭代器。一个消费适配器的例子是 sum 方法。这个方法获取迭代器的所有权并反复调用next 来遍历迭代器,因而会消费迭代器。当其遍历每一个项时,它将每一个项加总到一个总和并在迭代完成时返回总和。

要注意的是,调用sum方法之后就无法使用v1_iter了,因为调用sum方法时该方法会获得迭代器的所有权。
3、产生其他迭代器的方法
Iterator trait 中定义了另一类方法,被称为 迭代器适配器(iterator adaptors),他们允许我们将当前迭代器变为不同类型的迭代器。可以链式调用多个迭代器适配器。不过因为所有的迭代器都是惰性的,必须调用一个消费适配器方法以便获取迭代器适配器调用的结果。