From 328b940944ebd615b514cb33565d504518817f90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A1=BB=E8=AF=AD?= Date: Wed, 28 May 2025 16:10:00 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=87=E5=AD=97?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除重复文字,将奇怪的斜体改为加粗。 --- src/ch13-01-closures.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ch13-01-closures.md b/src/ch13-01-closures.md index f8cdad3..cc47501 100644 --- a/src/ch13-01-closures.md +++ b/src/ch13-01-closures.md @@ -39,7 +39,7 @@ Rust 的 **闭包**(*closures*)是可以保存在变量中或作为参数传 闭包通常较短,并且只与特定的上下文相关,而不是适用于任意情境。在这些有限的上下文中,编译器可以推断参数和返回值的类型,类似于它推断大多数变量类型的方式(尽管在某些罕见的情况下,编译器也需要闭包的类型注解)。 -类似于变量,如果我们希望增加代码的明确性和清晰度,可以添加类型注解,但代价是是会使代码变得比严格必要的更冗长。为示例 13-1 中定义的闭包标注类型看起来如示例 13-2 中的定义一样。这个例子中,我们定义了一个闭包并将它保存在变量中,而不是像示例 13-1 那样在传参的地方定义它。 +类似于变量,如果我们希望增加代码的明确性和清晰度,可以添加类型注解,但代价是会使代码变得比严格必要的更冗长。为示例 13-1 中定义的闭包标注类型看起来如示例 13-2 中的定义一样。这个例子中,我们定义了一个闭包并将它保存在变量中,而不是像示例 13-1 那样在传参的地方定义它。 文件名:src/main.rs @@ -76,7 +76,7 @@ let add_one_v4 = |x| x + 1 ; {{#include ../listings/ch13-functional-features/listing-13-03/output.txt}} ``` -第一次使用 `String` 值调用 `example_closure` 时,编译器推断出 `x` 的类型以及闭包的返回类型为 `String`。接着这些类型被锁定进闭包 `example_closure` 闭包中,如果尝试对同一闭包使用不同类型则就会得到类型错误。 +第一次使用 `String` 值调用 `example_closure` 时,编译器推断出 `x` 的类型以及闭包的返回类型为 `String`。接着这些类型被锁定进闭包 `example_closure` 中,如果尝试对同一闭包使用不同类型则就会得到类型错误。 ### 捕获引用或移动所有权 @@ -134,7 +134,7 @@ let add_one_v4 = |x| x + 1 ; ### 将捕获的值移出闭包和 `Fn` trait -一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移*进*闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移*出*闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 +一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移**进**闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移**出**闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 闭包捕获和处理环境中的值的方式会影响闭包实现哪些 trait,而 trait 是函数和结构体指定它们可以使用哪些类型闭包的方式。根据闭包体如何处理这些值,闭包会自动、渐进地实现一个、两个或全部三个 `Fn` trait。 From 56691e868ae488bd63447e3b915d1ec46a71c104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A1=BB=E8=AF=AD?= Date: Wed, 28 May 2025 16:19:19 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=B0=86=E5=89=8D=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=8A=A0=E7=B2=97=E7=9A=84=E5=8E=9F=E6=96=9C?= =?UTF-8?q?=E4=BD=93=E6=94=B9=E4=B8=BA=E6=99=AE=E9=80=9A=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加粗是专有名词,故将其修改为普通文本。 --- src/ch13-01-closures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch13-01-closures.md b/src/ch13-01-closures.md index cc47501..bc5e6e0 100644 --- a/src/ch13-01-closures.md +++ b/src/ch13-01-closures.md @@ -134,7 +134,7 @@ let add_one_v4 = |x| x + 1 ; ### 将捕获的值移出闭包和 `Fn` trait -一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移**进**闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移**出**闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 +一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移进闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移出闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 闭包捕获和处理环境中的值的方式会影响闭包实现哪些 trait,而 trait 是函数和结构体指定它们可以使用哪些类型闭包的方式。根据闭包体如何处理这些值,闭包会自动、渐进地实现一个、两个或全部三个 `Fn` trait。 From dd22f2ad133ae1bcb0d92227d5ec4bc56c901583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A1=BB=E8=AF=AD?= Date: Wed, 28 May 2025 22:07:55 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=96=87=E5=AD=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch15-02-deref.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch15-02-deref.md b/src/ch15-02-deref.md index e0b9702..e853487 100644 --- a/src/ch15-02-deref.md +++ b/src/ch15-02-deref.md @@ -103,7 +103,7 @@ *(y.deref()) ``` -Rust 将 `*` 运算符替换为先调用 `deref` 方法再进行普通解引用的操作,如此我们便不用担心是否还需手动调用 `deref` 方法了。Rust 的这个特性可以让我们写出行为一致的代码,无论是面对的是常规引用还是实现了 `Deref` 的类型。 +Rust 将 `*` 运算符替换为先调用 `deref` 方法再进行普通解引用的操作,如此我们便不用担心是否还需手动调用 `deref` 方法了。Rust 的这个特性可以让我们写出行为一致的代码,无论面对的是常规引用还是实现了 `Deref` 的类型。 `deref` 方法返回值的引用,以及 `*(y.deref())` 括号外边的普通解引用仍为必须的原因在于所有权。如果 `deref` 方法直接返回值而不是值的引用,其值将被移出 `self`。在这里以及大部分使用解引用运算符的情况下我们并不希望获取 `MyBox` 内部值的所有权。 From 05f3a90892c8bd9043bdd587c7954f63360a74d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A1=BB=E8=AF=AD?= Date: Thu, 29 May 2025 16:59:36 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=96=87=E5=AD=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch16-01-threads.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch16-01-threads.md b/src/ch16-01-threads.md index 715337b..836c37e 100644 --- a/src/ch16-01-threads.md +++ b/src/ch16-01-threads.md @@ -141,7 +141,7 @@ Rust 会**推断**如何捕获 `v`,因为 `println!` 只需要 `v` 的引用 示例 16-4: 一个具有闭包的线程,尝试使用一个在主线程中被回收的引用 `v` -如果 Rust 允许这段代码运行,则新建线程则可能会立刻被转移到后台并完全没有机会运行。新建线程内部有一个 `v` 的引用,不过主线程立刻就使用第十五章讨论的 `drop` 丢弃了 `v`。接着当新建线程开始执行,`v` 已不再有效,所以其引用也是无效的。噢,这太糟了! +如果 Rust 允许这段代码运行,则新建线程可能会立刻被转移到后台并完全没有机会运行。新建线程内部有一个 `v` 的引用,不过主线程立刻就使用第十五章讨论的 `drop` 丢弃了 `v`。接着当新建线程开始执行,`v` 已不再有效,所以其引用也是无效的。噢,这太糟了! 为了修复示例 16-3 的编译错误,我们可以听取错误信息的建议: From 3ff08915817eb6ddafc6ca6b892bfcd9ee0d6092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A1=BB=E8=AF=AD?= Date: Thu, 29 May 2025 17:02:06 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=90=8E=E7=BB=AD=E7=AB=A0=E8=8A=82?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=85=B3=E9=94=AE=E5=AD=97=E5=8A=A0=E7=B2=97?= =?UTF-8?q?=EF=BC=8C=E6=95=85=E7=BB=9F=E4=B8=80=E5=9B=9E=E8=AF=A5=E8=A7=84?= =?UTF-8?q?=E5=88=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后续章节出现了非专有名词的加粗,故将原本奇怪的斜体修改为加粗,统一表现方式。 --- src/ch13-01-closures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch13-01-closures.md b/src/ch13-01-closures.md index bc5e6e0..cc47501 100644 --- a/src/ch13-01-closures.md +++ b/src/ch13-01-closures.md @@ -134,7 +134,7 @@ let add_one_v4 = |x| x + 1 ; ### 将捕获的值移出闭包和 `Fn` trait -一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移进闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移出闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 +一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移**进**闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移**出**闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 闭包捕获和处理环境中的值的方式会影响闭包实现哪些 trait,而 trait 是函数和结构体指定它们可以使用哪些类型闭包的方式。根据闭包体如何处理这些值,闭包会自动、渐进地实现一个、两个或全部三个 `Fn` trait。