From 81527ab90382765d3f4fb00cdbf987ee5bc7697e Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Thu, 14 Apr 2022 13:25:57 +0800 Subject: [PATCH] fix: typo in async --- src/async-rust/async/multi-futures-simultaneous.md | 2 +- src/async-rust/async/pain-points-and-workarounds.md | 8 ++++---- src/async-rust/async/web-server.md | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/async-rust/async/multi-futures-simultaneous.md b/src/async-rust/async/multi-futures-simultaneous.md index 9e45a657..f54d1a91 100644 --- a/src/async-rust/async/multi-futures-simultaneous.md +++ b/src/async-rust/async/multi-futures-simultaneous.md @@ -142,7 +142,7 @@ pub fn main() { 以上代码 `default` 分支由于最后一个运行,而在它之前 `complete` 分支已经通过 `break` 跳出了循环,因此`default`永远不会被执行。 -如果你希望 `default` 也有机会漏下脸,可以将 `complete` 的 `break` 修改为其它的,例如`println!("completed!")`,然后再观察下运行结果。 +如果你希望 `default` 也有机会露下脸,可以将 `complete` 的 `break` 修改为其它的,例如`println!("completed!")`,然后再观察下运行结果。 再回到 `select` 的第一个例子中,里面有一段代码长这样: diff --git a/src/async-rust/async/pain-points-and-workarounds.md b/src/async-rust/async/pain-points-and-workarounds.md index 7a6a4fed..35772aef 100644 --- a/src/async-rust/async/pain-points-and-workarounds.md +++ b/src/async-rust/async/pain-points-and-workarounds.md @@ -35,7 +35,7 @@ error[E0282]: type annotations needed | ^^ cannot infer type for type parameter `E` declared on the enum `Result` ``` -原因在于编译器无法推断出 `Result`中的 `E` 的类型, 而且编译器的提示`consider giving fut a type`你也别傻乎乎的相信,然后尝试半天,最后无奈放弃:目前还没有办法为 `async` 语句块指定返回类型。 +原因在于编译器无法推断出 `Result`中的 `E` 的类型, 而且编译器的提示```consider giving `fut` a type```你也别傻乎乎的相信,然后尝试半天,最后无奈放弃:目前还没有办法为 `async` 语句块指定返回类型。 既然编译器无法推断出类型,那咱就给它更多提示,可以使用 `::< ... >` 的方式来增加类型注释: @@ -112,7 +112,7 @@ note: future is not `Send` as this value is used across an await 其中一个可能的解决方法是在 `.await` 之前就使用 `std::mem::drop` 释放掉 `Rc`,但是很可惜,截止今天,该方法依然不能解决这种问题。 -不知道有多少同学还记得语句块 `{ ... }` 在 Rust 中其实具有非常重要的作用(特别是相比其它大多数语言来说时):可以将变量声明在语句块内,当语句块结束时,变量会自动被 `drop`,这个规则可以帮助我们解决很多借用冲突问题,特别是在 `NLL` 出来之前。 +不知道有多少同学还记得语句块 `{ ... }` 在 Rust 中其实具有非常重要的作用(特别是相比其它大多数语言来说时):可以将变量声明在语句块内,当语句块结束时,变量会自动被 Drop,这个规则可以帮助我们解决很多借用冲突问题,特别是在 `NLL` 出来之前。 ```rust async fn foo() { @@ -123,7 +123,7 @@ async fn foo() { } ``` -是不是很简单?最终我们还是通过 `Drop` 的方式解决了这个问题,当然,还是期待未来 `std::mem::drop` 也能派上用场。 +是不是很简单?最终我们还是通过 Drop 的方式解决了这个问题,当然,还是期待未来 `std::mem::drop` 也能派上用场。 ## 递归使用 async fn @@ -166,7 +166,7 @@ error[E0733]: recursion in an `async fn` requires boxing = note: a recursive `async fn` must be rewritten to return a boxed future. ``` -如果认真学过之前的章节,大家应该知道只要将其使用 `Box` 放到堆上而不是栈上,就可以解决,在这里还是要称赞下 Rust 的编译器,给出的提示总是这么精确`recursion in an async fn requires boxing`。 +如果认真学过之前的章节,大家应该知道只要将其使用 `Box` 放到堆上而不是栈上,就可以解决,在这里还是要称赞下 Rust 的编译器,给出的提示总是这么精确```recursion in an `async fn` requires boxing```。 就算是使用 `Box`,这里也大有讲究。如果我们试图使用 `Box::pin` 这种方式去包裹是不行的,因为编译器自身的限制限制了我们(刚夸过它。。。)。为了解决这种问题,我们只能将 `recursive` 转变成一个正常的函数,该函数返回一个使用 `Box` 包裹的 `async` 语句块: diff --git a/src/async-rust/async/web-server.md b/src/async-rust/async/web-server.md index 7a32a7be..c51784c0 100644 --- a/src/async-rust/async/web-server.md +++ b/src/async-rust/async/web-server.md @@ -52,7 +52,7 @@ fn handle_connection(mut stream: TcpStream) { `hello.html`: -```rust +```html @@ -68,7 +68,7 @@ fn handle_connection(mut stream: TcpStream) { `404.html`: -```rust +```html @@ -276,7 +276,7 @@ impl Read for MockTcpStream { } ``` -`Write`的实现也类似,需要实现三个方法 : `poll_write`, `poll_flush`, 与 `poll_close`。 `poll_write` 会拷贝输入数据到 mock 的 `TcpStream` 中,当完成后返回 `Poll::Ready`。由于 `TcpStream` 无需 `flush` 和 `close`,因此另两个方法直接返回 `Poll::Ready` 即可. +`Write`的实现也类似,需要实现三个方法 : `poll_write`, `poll_flush`, 与 `poll_close`。 `poll_write` 会拷贝输入数据到 mock 的 `TcpStream` 中,当完成后返回 `Poll::Ready`。由于 `TcpStream` 无需 `flush` 和 `close`,因此另两个方法直接返回 `Poll::Ready` 即可。 ```rust impl Write for MockTcpStream {