From b55337eccb4d2e2a8d715c567cad5b2984624948 Mon Sep 17 00:00:00 2001 From: sunface Date: Sun, 13 Mar 2022 13:20:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=85=B3=E8=81=94=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SUMMARY.md | 1 + src/basic/trait/advance-trait.md | 9 +++++++-- src/too-many-lists/iter.md | 1 + 内容变更记录.md | 4 ++++ 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/too-many-lists/iter.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 800199b7..1f49f1f0 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -162,6 +162,7 @@ - [还可以的单向链表](too-many-lists/ok-stack/intro.md) - [优化类型定义](too-many-lists/ok-stack/type-optimizing.md) - [定义 Peek 函数](too-many-lists/ok-stack/peek.md) + - [IntoIter、Iter 和 IterMut](too-many-lists/iter.md) - [易混淆概念解析](confonding/intro.md) - [切片和切片引用](confonding/slice.md) diff --git a/src/basic/trait/advance-trait.md b/src/basic/trait/advance-trait.md index 085723f4..a5293933 100644 --- a/src/basic/trait/advance-trait.md +++ b/src/basic/trait/advance-trait.md @@ -20,7 +20,7 @@ pub trait Iterator { 同时,`next` 方法也返回了一个 `Item` 类型,不过使用 `Option` 枚举进行了包裹,假如迭代器中的值是 `i32` 类型,那么调用 `next` 方法就将获取一个 `Option` 的值。 -还记得 `Self` 吧?在之前的章节[提到过](https://course.rs/basic/trait/trait-object#self与self), `Self` 用来指代当前的特征实例,那么 `Self::Item` 就用来指代特征实例中具体的 `Item` 类型: +还记得 `Self` 吧?在之前的章节[提到过](https://course.rs/basic/trait/trait-object#self-与-self), **`Self` 用来指代当前调用者的具体类型,那么 `Self::Item` 就用来指代该类型实现中定义的 `Item` 类型**: ```rust impl Iterator for Counter { @@ -30,9 +30,14 @@ impl Iterator for Counter { // --snip-- } } + +fn main() { + let c = Counter{..} + c.next() +} ``` -在上述代码中,我们为 `Counter` 类型实现了 `Iterator` 特征,那么 `Self` 就是当前的 `Iterator` 特征对象, `Item` 就是 `u32` 类型。 +在上述代码中,我们为 `Counter` 类型实现了 `Iterator` 特征,变量 `c` 是特征 `Iterator` 的实例,也是 `next` 方法的调用者。 结合之前的黑体内容可以得出:对于 `next` 方法而言,`Self` 是调用者 `c` 的具体类型: `Counter`,而 `Self::Item` 是 `Counter` 中定义的 `Item` 类型: `u32`。 聪明的读者之所以聪明,是因为你们喜欢联想和举一反三,同时你们也喜欢提问:为何不用泛型,例如如下代码: diff --git a/src/too-many-lists/iter.md b/src/too-many-lists/iter.md new file mode 100644 index 00000000..4691a464 --- /dev/null +++ b/src/too-many-lists/iter.md @@ -0,0 +1 @@ +# IntoIter、Iter 和 IterMut diff --git a/内容变更记录.md b/内容变更记录.md index 1b0fbf1f..a43da2c5 100644 --- a/内容变更记录.md +++ b/内容变更记录.md @@ -1,6 +1,10 @@ # ChangeLog 记录一些值得注意的变更。 +## 2022-03-13 + +- 优化[进一步深入特赠 - 关联类型](https://course.rs/basic/trait/advance-trait.html#关联类型)中的部分内容,感谢 AllenYu0018 的[提示](https://github.com/sunface/rust-course/discussions/392). + ## 2022-03-11 - 新增章节: [还 OK 的单向链表 - Peek 函数](https://course.rs/too-many-lists/ok-stack/peek.html)