From 352a0d360edc3a6f8db2c7ca5663dc9b980e2762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A1=BB=E8=AF=AD?= Date: Sun, 1 Jun 2025 20:13:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=80=E4=BA=9B=E6=96=87?= =?UTF-8?q?=E5=AD=97=E6=8F=8F=E8=BF=B0=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/appendix-03-derivable-traits.md | 2 +- src/ch21-01-single-threaded.md | 2 +- src/ch21-03-graceful-shutdown-and-cleanup.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/appendix-03-derivable-traits.md b/src/appendix-03-derivable-traits.md index 39984dd..d8791ea 100644 --- a/src/appendix-03-derivable-traits.md +++ b/src/appendix-03-derivable-traits.md @@ -59,7 +59,7 @@ `Clone` trait 可以明确地创建一个值的深拷贝(deep copy),复制过程可能包含任意代码的执行以及堆上数据的复制。查阅第四章 [“使用克隆的变量与数据交互”][variables-and-data-interacting-with-clone] 以获取有关 `Clone` 的更多信息。 -派生 `Clone` 实现了 `clone` 方法,当其为整个类型实现时,会在类型的每一部分上调用了 `clone` 方法。这意味着类型中所有字段或值也必须实现了 `Clone`,这样才能够派生 `Clone` 。 +派生 `Clone` 实现了 `clone` 方法,当其为整个类型实现时,会在类型的每一部分上调用 `clone` 方法。这意味着类型中所有字段或值也必须实现了 `Clone`,这样才能够派生 `Clone` 。 例如,当在一个 slice 上调用 `to_vec` 方法时,`Clone` 是必须的。slice 并不拥有其包含的实例,但是从 `to_vec` 中返回的 vector 需要拥有它们的实例,因此 `to_vec` 在每个元素上调用 `clone`。所以存储在切片中的类型必须实现 `Clone`。 diff --git a/src/ch21-01-single-threaded.md b/src/ch21-01-single-threaded.md index 4d13fa5..f523ff7 100644 --- a/src/ch21-01-single-threaded.md +++ b/src/ch21-01-single-threaded.md @@ -255,4 +255,4 @@ HTTP/1.1 200 OK\r\n\r\n 好极了!我们现在有了一个 40 行左右 Rust 代码的小而简单的服务端,它对一个请求返回页面内容而对所有其他请求返回 404 响应。 -目前服务端运行于单线程中,这意味着它一次只能处理一个请求。让我们模拟一些慢请求来看看这如何会成为一个问题。然后我们将修复它使得服务端能够同时处理多个请求。 +目前服务端运行于单线程中,这意味着它一次只能处理一个请求。让我们模拟一些慢请求来看看这为何会成为一个问题。然后我们将修复它使得服务端能够同时处理多个请求。 diff --git a/src/ch21-03-graceful-shutdown-and-cleanup.md b/src/ch21-03-graceful-shutdown-and-cleanup.md index aacc3ca..c14c39e 100644 --- a/src/ch21-03-graceful-shutdown-and-cleanup.md +++ b/src/ch21-03-graceful-shutdown-and-cleanup.md @@ -29,7 +29,7 @@ 这里的错误告诉我们并不能调用 `join`,因为我们只有每一个 `worker` 的可变借用,而 `join` 需要获取其参数的所有权。为了解决这个问题,需要一个方法将 `thread` 移动出拥有其所有权的 `Worker` 实例以便 `join` 可以消费这个线程。示例 18-15 中我们曾见过这么做的方法:如果 `Worker` 存放的是 `Option`,就可以在 `Option` 上调用 `take` 方法将值从 `Some` 成员中移动出来而对 `None` 成员不做处理。换句话说,正在运行的 `Worker` 的 `thread` 将是 `Some` 成员值,而当需要清理 worker 时,将 `Some` 替换为 `None`,这样 worker 就没有可以运行的线程了。 -然而,这种情况**只**会在丢弃 `Worker` 时出现。相应地,我们必须在任何访问 `worker.thread` 的处理 `Option>`。在惯用的 Rust 代码中 `Option` 用的很多,但当你发现自己总是知道 `Option` 中一定会有值,却还要将其包装在 `Option` 中来应对这一场景时,就应该考虑其他更优雅的方法了。 +然而,这种情况**只**会在丢弃 `Worker` 时出现。相应地,我们必须在任何访问 `worker.thread` 时处理 `Option>`。在惯用的 Rust 代码中 `Option` 用的很多,但当你发现自己总是知道 `Option` 中一定会有值,却还要将其包装在 `Option` 中来应对这一场景时,就应该考虑其他更优雅的方法了。 在这个例子中,存在一个更好的替代方案:`Vec::drain` 方法。它接受一个 range 参数来指定哪些项要从 `Vec` 中移除,并返回一个这些项的迭代器。使用 `..` range 语法会从 `Vec` 中移除**所有**值。