From 76a71eb7d6703630abbcf934b89c21753af99b79 Mon Sep 17 00:00:00 2001 From: sunface Date: Thu, 17 Mar 2022 13:41:40 +0800 Subject: [PATCH] =?UTF-8?q?rename=20Rust=E7=BC=96=E7=A8=8B=E5=AD=A6?= =?UTF-8?q?=E9=99=A2=20->=20Rust=E8=AF=AD=E8=A8=80=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E7=A4=BE=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- src/SUMMARY.md | 1 - src/about-book.md | 2 +- src/too-many-lists/deque/iterator.md | 63 ++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0f862b49..53b3b840 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ - 在线阅读 - - Rust编程学院: [https://course.rs](https://course.rs) + - 官网: [https://course.rs](https://course.rs) - 知乎专栏: [支持章节内目录跳转,很好用!](https://www.zhihu.com/column/c_1452781034895446017) - 配套项目 @@ -50,7 +50,7 @@ ## 学习社区 -为了帮助大家更好的学习和交流 Rust,我们建立了一个社区:**Rust编程学院**。 +为了帮助大家更好的学习和交流 Rust,我们建立了一个社区:**Rust语言学习社区**。 QQ群 1009730433, 欢迎大家加入,一起 happy,一起进步。 diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 2e400eb1..00182480 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -240,7 +240,6 @@ - [编译器优化 todo](profiling/compiler/optimization/intro.md) - [Option 枚举 todo](profiling/compiler/optimization/option.md) - - [标准库解析 todo](std/intro.md) - [标准库使用最佳时间 todo](std/search.md) - [Vector 常用方法 todo](std/vector.md) diff --git a/src/about-book.md b/src/about-book.md index fcbfa616..6c577d8b 100644 --- a/src/about-book.md +++ b/src/about-book.md @@ -50,7 +50,7 @@ ## 学习社区 -为了帮助大家更好的学习和交流 Rust,我们建立了一个社区:**Rust编程学院**。 +为了帮助大家更好的学习和交流 Rust,我们建立了一个社区:**Rust学习社区**。 QQ群 1009730433, 欢迎大家加入,一起 happy,一起进步。 diff --git a/src/too-many-lists/deque/iterator.md b/src/too-many-lists/deque/iterator.md index 51967d55..199e69e2 100644 --- a/src/too-many-lists/deque/iterator.md +++ b/src/too-many-lists/deque/iterator.md @@ -24,3 +24,66 @@ impl Iterator for IntoIter { 答案是: `DoubleEndedIterator`,它继承自 `Iterator`( 通过 [`supertrait`](https://course.rs/basic/trait/advance-trait.html?highlight=supertrait#特征定义中的特征约束) ),因此意味着要实现该特征,首先需要实现 `Iterator`。 +这样只要为 `DoubleEndedIterator` 实现 `next_back` 方法,就可以支持双向迭代了: `Iterator` 的 `next` 方法从前往后,而 `next_back` 从后向前。 + +```rust +impl DoubleEndedIterator for IntoIter { + fn next_back(&mut self) -> Option { + self.0.pop_back() + } +} +``` + +测试下: +```rust +#[test] +fn into_iter() { + let mut list = List::new(); + list.push_front(1); list.push_front(2); list.push_front(3); + + let mut iter = list.into_iter(); + assert_eq!(iter.next(), Some(3)); + assert_eq!(iter.next_back(), Some(1)); + assert_eq!(iter.next(), Some(2)); + assert_eq!(iter.next_back(), None); + assert_eq!(iter.next(), None); +} +``` + +```shell +cargo test + + Running target/debug/lists-5c71138492ad4b4a + +running 11 tests +test fourth::test::basics ... ok +test fourth::test::peek ... ok +test fourth::test::into_iter ... ok +test first::test::basics ... ok +test second::test::basics ... ok +test second::test::iter ... ok +test second::test::iter_mut ... ok +test third::test::iter ... ok +test third::test::basics ... ok +test second::test::into_iter ... ok +test second::test::peek ... ok + +test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured +``` + +## Iter +这里又要用到糟糕的 `Ref`: +```rust +pub struct Iter<'a, T>(Option>>); + +impl List { + pub fn iter(&self) -> Iter { + Iter(self.head.as_ref().map(|head| head.borrow())) + } +} +``` + +```shell +> cargo build +``` +