Update iterator.md

pull/311/head
Jesse 3 years ago committed by GitHub
parent 12c27f6138
commit cc9939de12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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

Loading…
Cancel
Save