From 257b5ca44d50eec77945c60f6f2bc6b4598977b5 Mon Sep 17 00:00:00 2001 From: KaiserY Date: Thu, 15 Aug 2024 10:39:39 +0800 Subject: [PATCH] update ch13-01 & add proofreading_prompt.md close #809 --- README.md | 4 ++++ proofreading_prompt.md | 32 ++++++++++++++++++++++++++++++++ src/ch13-01-closures.md | 16 ++++++++-------- terminology.md | 4 ---- 4 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 proofreading_prompt.md delete mode 100644 terminology.md diff --git a/README.md b/README.md index 56c526f..0be057a 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,10 @@ PS: [source]: https://github.com/rust-lang/book/tree/main/src +## 校对 + +部分翻译采用 ChatGPT 4o 进行翻译校对。提示词详见 [proofreading_prompt.md](proofreading_prompt.md) + ## 静态页面构建与文档撰写 ### 构建 diff --git a/proofreading_prompt.md b/proofreading_prompt.md new file mode 100644 index 0000000..8616b80 --- /dev/null +++ b/proofreading_prompt.md @@ -0,0 +1,32 @@ +**任务说明:** + +作为一名专业翻译,同时精通 Rust 编程语言,你的任务是对提供的英文原文进行校对,并确保中文翻译的准确性。 + +**要求:** + +1. **格式保留**:在校对过程中,请尽量保持原有中文翻译的格式和结构。 +2. **术语保留**:对于中文翻译中出现的英文专业术语,不要进行翻译,直接保留原文。 +3. **校对标准**:在校对时,请依据英文原文对中文翻译进行全面检查,确保准确传达原文的含义。 +4. **专业性**:请尊重专业领域的翻译技巧,避免简单直译,而是根据上下文做出最适当的调整。 + +**输入:** + +- 英文原文: + +``` + +``` + +- 中文翻译: + +``` + +``` + +**输出:** + +- 中文翻译校对: + +``` + +``` diff --git a/src/ch13-01-closures.md b/src/ch13-01-closures.md index eb0edfd..924e850 100644 --- a/src/ch13-01-closures.md +++ b/src/ch13-01-closures.md @@ -4,13 +4,13 @@ >
> commit a2cb72d3ad7584cc1ae3b85f715c877872f5e3ab -Rust 的 **闭包**(*closures*)是可以保存在一个变量中或作为参数传递给其他函数的匿名函数。可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获被定义时所在作用域中的值。我们将展示闭包的这些功能如何复用代码和自定义行为。 +Rust 的 **闭包**(*closures*)是可以保存在变量中或作为参数传递给其他函数的匿名函数。你可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获其被定义时所在作用域中的值。我们将展示这些闭包特性如何支持代码复用和行为定制。 ### 闭包会捕获其环境 -我们首先了解如何通过闭包捕获定义它的环境中的值以便之后使用。考虑如下场景:有时 T 恤公司会赠送限量版 T 恤给邮件列表中的成员作为促销。邮件列表中的成员可以选择将他们的喜爱的颜色添加到个人信息中。如果被选中的成员设置了喜爱的颜色,他们将获得那个颜色的 T 恤。如果他没有设置喜爱的颜色,他们会获赠公司现存最多的颜色的款式。 +我们首先了解如何通过闭包捕获定义它的环境中的值以便之后使用。考虑如下场景:我们的 T 恤公司偶尔会向邮件列表中的某位成员赠送一件限量版的独家 T 恤作为促销。邮件列表中的成员可以选择将他们的喜爱的颜色添加到个人信息中。如果被选中的成员设置了喜爱的颜色,他们将获得那个颜色的 T 恤。如果他没有设置喜爱的颜色,他们会获赠公司当前库存最多的颜色的款式。 -有很多种方式来实现这些。例如,使用有 `Red` 和 `Blue` 两个成员的 `ShirtColor` 枚举(出于简单考虑限定为两种颜色)。我们使用 `Inventory` 结构体来代表公司的库存,它有一个类型为 `Vec` 的 `shirts` 字段表示库存中的衬衫的颜色。`Inventory` 上定义的 `giveaway` 方法获取免费衬衫得主所喜爱的颜色(如有),并返回其获得的衬衫的颜色。初始代码如示例 13-1 所示: +有很多种方式来实现这一点。例如,使用有 `Red` 和 `Blue` 两个成员的 `ShirtColor` 枚举(出于简单考虑限定为两种颜色)。我们使用 `Inventory` 结构体来代表公司的库存,它有一个类型为 `Vec` 的 `shirts` 字段表示库存中的衬衫的颜色。`Inventory` 上定义的 `giveaway` 方法获取免费衬衫得主所喜爱的颜色(如有),并返回其获得的衬衫的颜色。初始代码如示例 13-1 所示: 文件名:src/main.rs @@ -139,13 +139,13 @@ let add_one_v4 = |x| x + 1 ; ### 将被捕获的值移出闭包和 `Fn` trait -一旦闭包捕获了定义它的环境中一个值的引用或者所有权(也就影响了什么会被移 _进_ 闭包,如有),闭包体中的代码定义了稍后在闭包计算时对引用或值如何操作(也就影响了什么会被移 _出_ 闭包,如有)。闭包体可以做以下任何事:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获值。 +一旦闭包捕获了定义它的环境中的某个值的引用或所有权(也就影响了什么会被移 _进_ 闭包,如有),闭包体中的代码则决定了在稍后执行闭包时,这些引用或值将如何处理(也就影响了什么会被移 _出_ 闭包,如有)。闭包体可以执行以下任一操作:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获任何值。 -闭包捕获和处理环境中的值的方式影响闭包实现的 trait。Trait 是函数和结构体指定它们能用的闭包的类型的方式。取决于闭包体如何处理值,闭包自动、渐进地实现一个、两个或三个 `Fn` trait。 +闭包捕获和处理环境中的值的方式会影响闭包实现哪些 trait,而 trait 是函数和结构体指定它们可以使用哪些类型闭包的方式。根据闭包体如何处理这些值,闭包会自动、渐进地实现一个、两个或全部三个 `Fn` trait。 -1. `FnOnce` 适用于能被调用一次的闭包,所有闭包都至少实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值移入闭包体的闭包只实现 `FnOnce` trait,这是因为它只能被调用一次。 -2. `FnMut` 适用于不会将捕获的值移入闭包体的闭包,但它可能会修改被捕获的值。这类闭包可以被调用多次。 -3. `Fn` 适用于既不将被捕获的值移入闭包体也不修改被捕获的值的闭包,当然也包括不从环境中捕获值的闭包。这类闭包可以被调用多次而不改变它们的环境,这在会多次并发调用闭包的场景中十分重要。 +1. `FnOnce` 适用于只能被调用一次的闭包。所有闭包至少都实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值从闭包体中移出的闭包只会实现 `FnOnce` trait,而不会实现其他 `Fn` 相关的 trait,因为它只能被调用一次。 +2. `FnMut` 适用于不会将捕获的值移出闭包体,但可能会修改捕获值的闭包。这类闭包可以被调用多次。 +3. `Fn` 适用于既不将捕获的值移出闭包体,也不修改捕获值的闭包,同时也包括不从环境中捕获任何值的闭包。这类闭包可以被多次调用而不会改变其环境,这在会多次并发调用闭包的场景中十分重要。 让我们来看示例 13-1 中使用的在 `Option` 上的 `unwrap_or_else` 方法的定义: diff --git a/terminology.md b/terminology.md deleted file mode 100644 index dae63a1..0000000 --- a/terminology.md +++ /dev/null @@ -1,4 +0,0 @@ -## 中英文对照 - -- high-level: 高层 -- low-level: 底层