Improve Ch13

This commit is contained in:
Unisko PENG 2023-04-28 10:03:15 +08:00
parent 3ab4a2347b
commit 2dc65f2cdf
2 changed files with 14 additions and 10 deletions

View File

@ -522,9 +522,9 @@ fn main() {
*清单 13-10创建迭代器*
这个迭代器被存储在变量 `v1_iter` 中。一旦咱们已创建出迭代器,咱们就能以多种方式使用他。在第 3 章中的清单 3-5 中,就曾使用了一个 `for` 循环,对一个数组进行过迭代,而在该数组的各个条目上执行一些代码。而在使用 `for` 循环这表象之下,则是隐式地创建出了一个迭代器,并于随后消费了这个迭代器,不过在本小节之前,只是并未提及其确切工作原理。
迭代器被存储在变量 `v1_iter` 中。一旦咱们已创建出迭代器,就能以多种方式使用他。在第 3 章中的清单 3-5 中,就曾使用了 `for` 循环,对数组进行迭代,而在该数组的各个条目上执行代码。在使用 `for` 循环表象下,便是隐式地创建出迭代器,并随后消费迭代器,但直到现在,我们都未提及其原理。
下面清单 13-11 中的示例里,就把迭代器的创建,从那个 `for` 循环中迭代器的使用分离开来了。在使用 `v1_iter` 中的迭代器,调用那个 `for` 循环时,在那个迭代器中的各个元素,就在那个循环的一个个迭代中,被使用了,而这就会打印出各个值。
下面清单 13-11 中的示例里,咱们把迭代器的创建,与 `for` 循环中迭代器的使用分离开了。当使用 `v1_iter` 中的迭代器,调用 `for` 循环时,迭代器中的各个元素,就会在循环的每次迭代中被使用,这就打印出了各个值。
```rust
let v1 = vec! [1, 2, 3];
@ -536,15 +536,15 @@ fn main() {
}
```
*清单 13-11 `for` 循环中使用迭代器*
*清单 13-11 `for` 循环中使用迭代器*
那些不具备由语言标准库所提供迭代器的编程语言中,就会大概率要通过一个从 `0` 开始的索引变量,而使用那个变量,来进入到该矢量值中,以获取到一个值,并在一个循环中对这个索引变量值进行递增,直到该索引变量达到该矢量中全部条目数为止
不具备由其标准库提供的迭代器的编程语言中,咱们很可能通过从 `0` 开始开始一个索引变量,使用那个变量索引到矢量值中来获取到一个值,并在循环中对递增索引变量值,直到索引变量达到矢量条目总数为止,而编写出这个同样功能
迭代器为咱们处理了这全部的逻辑,从而减少了可能潜在会出错的那些重复代码。对于许多不同类别的序列,而不光是那些可以索引进去的数据结构,比如矢量值,迭代器都能给到运用这同样逻辑的更多灵活性。接下来就要检视一下迭代器是怎样做到这样的。
迭代器为你处理所有这些逻辑,减少了咱们可能会搞砸的重复性代码。不只咱们可以索引的数据结构,比如矢量值,对于许多不同类别的序列,迭代器都给了我们运用同样逻辑的更多灵活性。咱们来看看迭代器是如何做到的。
### `Iterator` 特质与 `next` 方法
所有迭代器都实现了一个定义在标准库中、名为 `Iterator` 的特质。该特质的定义看起来像下面这样:
所有迭代器都实现了在标准库中定义的名为 `Iterator` 的特质。该特质的定义看起来像这样:
```rust
@ -553,15 +553,15 @@ pub trait Iterator {
fn next(&mut self) -> Option<Self::Item>;
// 这里省略了那些有着默认实现的方法
// 这里省略了有着默认实现的方法
}
```
请注意此定义使用了一些新的语法:`type Item` and `Self::Item`,他们定义着这个特质的一个 *关联类型associated type*。将在后面的第 19 章中,深入讲到关联类型。至于现在,要了解的全部,即此代码表明了这个 `Iterator` 特质的实现,有个还要定义一个 `Item` 类型的前提要求,且这个 `Item` 类型,会被用在其中的 `next` 方法返回值类型中。也就是说,这个 `Item` 类型将是该迭代器所返回的类型。
请注意此定义使用了新的语法:`type Item` 与 `Self::Item`,他们定义着此特质下的一个 *关联类型associated type*。在 19 章中,咱们将深入谈及关联类型。至于现在,咱们需要知道的全部,便是这段代码表明,实现 `Iterator` 特质需要咱们同时定义一个 `Item` 类型,而这个 `Item` 类型会在 `next` 方法返回值类型中用到。也就是说,`Item` 类型将是迭代器返回的类型。
`Iterator` 特质只要求实现者implementors定义一个方法即这个 `next` 方法,他会一次返回一个,封装在 `Some` 中该迭代器的条目,且在迭代完毕时,就返回 `None`
`Iterator` 特质只需要实现者implementors定义一个方法`next` 方法,该方法会一次返回一个封装在 `Some` 中的迭代器条目,当迭代完毕时,就会返回 `None`
是可以直接调用迭代器上的这个 `next` 方法的;下面清单 13-12 演示了,重复调用创建自该矢量的那个迭代器上的 `next` 方法,会返回些什么样的值。
咱们可以直接调用迭代器上的 `next` 方法;下面清单 13-12 演示了,在自矢量创建出的迭代器上,反复调用 `next` 方法,会返回的值。
文件名:`src/lib.rs`

View File

@ -791,6 +791,10 @@ $ rustup component add llvm-tools-preview
在闭包参数清单前,使用 `move` 关键字,让闭包取得其用到的所在环境中的值所有权。
- 关联类型
Associated type, 是通过 `type` 关键字定义在特质下的类型。咱们知道方法即为关联函数associated function那么关联类型自然与关联函数有些类似。
- 文档注释
Documentation comment, 将产生出 HTML 的注释。