From 1a9b4ea3d1831ddd5ccb732d81de41e2b05b83b7 Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Thu, 21 Apr 2022 13:22:52 +0800 Subject: [PATCH] fix: typo and add example --- src/async-rust/tokio/select.md | 4 ++-- src/async-rust/tokio/stream.md | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/async-rust/tokio/select.md b/src/async-rust/tokio/select.md index e8f99e45..f3c9096d 100644 --- a/src/async-rust/tokio/select.md +++ b/src/async-rust/tokio/select.md @@ -495,7 +495,7 @@ error[E0599]: no method named `poll` found for struct #### 修改一个分支 -下面一起来看看一个稍微复杂一些的 `loop` 循环,首先,我们拥有: +下面一起来看一个稍微复杂一些的 `loop` 循环,首先,我们拥有: - 一个消息通道可以传递 `i32` 类型的值 - 定义在 `i32` 值上的一个异步操作 @@ -566,7 +566,7 @@ thread 'main' panicked at '`async fn` resumed after completion', src/main.rs:1:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` -`async fn resumed after completion'` 错误的含义是:`async fn` 异步函数在完成后,依然被恢复了(继续使用)。 +```'`async fn` resumed after completion'``` 错误的含义是:`async fn` 异步函数在完成后,依然被恢复了(继续使用)。 回到例子中来,这个错误是由于 `operation` 在它已经调用完成后依然被使用。通常来说,当使用 `.await` 后,调用 `.await` 的值会被消耗掉,因此并不存在这个问题。但是在这例子中,我们在引用上调用 `.await`,因此之后该引用依然可以被使用。 diff --git a/src/async-rust/tokio/stream.md b/src/async-rust/tokio/stream.md index 134db44a..f533c9a8 100644 --- a/src/async-rust/tokio/stream.md +++ b/src/async-rust/tokio/stream.md @@ -180,6 +180,16 @@ got = b"6" 还有一点可以改进的地方:当 `filter` 和 `map` 一起使用时,你往往可以用一个统一的方法来实现 [`filter_map`](https://docs.rs/tokio-stream/0.1.8/tokio_stream/trait.StreamExt.html#method.filter_map)。 +```rust +let messages = subscriber + .into_stream() + .filter_map(|msg| match msg { + Ok(msg) if msg.content.len() == 1 => msg.unwrap().content, + _ => None, + }) + .take(3); +``` + 想要学习更多的适配器,可以看看 [`StreamExt`](https://docs.rs/tokio-stream/0.1.8/tokio_stream/trait.StreamExt.html) 特征。 ## 实现 Stream 特征