|
|
|
@ -269,7 +269,7 @@ assert_eq!(v2, vec![2, 3, 4]);
|
|
|
|
|
#### collect
|
|
|
|
|
上面代码中,使用了 `collect` 方法,该方法就是一个消费者适配器,使用它可以将一个迭代器中的元素收集到指定类型中,这里我们为 `v2` 标注了 `Vec<_>` 类型,就是为了告诉 `collect`:请把迭代器中的元素消费掉,然后把值收集成 `Vec<_>` 类型,至于为何使用 `_`,因为编译器会帮我们自动推导。
|
|
|
|
|
|
|
|
|
|
为何 `collect` 在消费时要指定类型?是因为该方法其实很强大,可以收集成多种不同的集合类型,`Vec<T>` 仅仅是其中之一,因此我们必须显式的告诉编译器我们想要收集成的集合类型(注意此处的类型和前面的类型是有区别的,此处指的是集合类型,上一段中指的是元素类型)。
|
|
|
|
|
为何 `collect` 在消费时要指定类型?是因为该方法其实很强大,可以收集成多种不同的集合类型,`Vec<T>` 仅仅是其中之一,因此我们必须显式的告诉编译器我们想要收集成的集合类型。
|
|
|
|
|
|
|
|
|
|
还有一点值得注意,`map` 会对迭代器中的每一个值进行一系列操作,然后把该值转换成另外一个新值,该操作是通过闭包 `|x| x + 1` 来完成:最终迭代器中的每个值都增加了 `1`,从 `[1, 2, 3]` 变为 `[2, 3, 4]`。
|
|
|
|
|
|
|
|
|
@ -353,7 +353,7 @@ assert_eq!(counter.next(), None);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 实现 Iterator 特征的其它方法
|
|
|
|
|
可以看出,实现自己的迭代器非常简单,但是 `Iterator` 特征中,不仅只有 `next` 一个方法,那为什么我们只需要实现它呢?因为其它方法都具有[默认实现](https://course.rs/basic/trait/trait.html#默认实现),所以无需像 `next` 这样手动去实现,而且这些默认实现的方法其实都是基于 `next` 方法实现的。
|
|
|
|
|
可以看出,实现自己的迭代器非常简单,但是 `Iterator` 特征中,不仅仅是只有 `next` 一个方法,那为什么我们只需要实现它呢?因为其它方法都具有[默认实现](https://course.rs/basic/trait/trait.html#默认实现),所以无需像 `next` 这样手动去实现,而且这些默认实现的方法其实都是基于 `next` 方法实现的。
|
|
|
|
|
|
|
|
|
|
下面的代码演示了部分方法的使用:
|
|
|
|
|
```rust
|
|
|
|
|