update ch13-01 & add proofreading_prompt.md close #809

pull/811/head
KaiserY 1 month ago
parent 94994e5b45
commit 257b5ca44d

@ -13,6 +13,10 @@ PS:
[source]: https://github.com/rust-lang/book/tree/main/src
## 校对
部分翻译采用 ChatGPT 4o 进行翻译校对。提示词详见 [proofreading_prompt.md](proofreading_prompt.md)
## 静态页面构建与文档撰写
### 构建

@ -0,0 +1,32 @@
**任务说明:**
作为一名专业翻译,同时精通 Rust 编程语言,你的任务是对提供的英文原文进行校对,并确保中文翻译的准确性。
**要求:**
1. **格式保留**:在校对过程中,请尽量保持原有中文翻译的格式和结构。
2. **术语保留**:对于中文翻译中出现的英文专业术语,不要进行翻译,直接保留原文。
3. **校对标准**:在校对时,请依据英文原文对中文翻译进行全面检查,确保准确传达原文的含义。
4. **专业性**:请尊重专业领域的翻译技巧,避免简单直译,而是根据上下文做出最适当的调整。
**输入:**
- 英文原文:
```
```
- 中文翻译:
```
```
**输出:**
- 中文翻译校对:
```
```

@ -4,13 +4,13 @@
> <br>
> commit a2cb72d3ad7584cc1ae3b85f715c877872f5e3ab
Rust 的 **闭包***closures*)是可以保存在一个变量中或作为参数传递给其他函数的匿名函数。可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获被定义时所在作用域中的值。我们将展示闭包的这些功能如何复用代码和自定义行为
Rust 的 **闭包***closures*)是可以保存在变量中或作为参数传递给其他函数的匿名函数。可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获被定义时所在作用域中的值。我们将展示这些闭包特性如何支持代码复用和行为定制
### 闭包会捕获其环境
我们首先了解如何通过闭包捕获定义它的环境中的值以便之后使用。考虑如下场景:有时 T 恤公司会赠送限量版 T 恤给邮件列表中的成员作为促销。邮件列表中的成员可以选择将他们的喜爱的颜色添加到个人信息中。如果被选中的成员设置了喜爱的颜色,他们将获得那个颜色的 T 恤。如果他没有设置喜爱的颜色,他们会获赠公司存最多的颜色的款式。
我们首先了解如何通过闭包捕获定义它的环境中的值以便之后使用。考虑如下场景:我们的 T 恤公司偶尔会向邮件列表中的某位成员赠送一件限量版的独家 T 恤作为促销。邮件列表中的成员可以选择将他们的喜爱的颜色添加到个人信息中。如果被选中的成员设置了喜爱的颜色,他们将获得那个颜色的 T 恤。如果他没有设置喜爱的颜色,他们会获赠公司当前库存最多的颜色的款式。
有很多种方式来实现这。例如,使用有 `Red``Blue` 两个成员的 `ShirtColor` 枚举(出于简单考虑限定为两种颜色)。我们使用 `Inventory` 结构体来代表公司的库存,它有一个类型为 `Vec<ShirtColor>``shirts` 字段表示库存中的衬衫的颜色。`Inventory` 上定义的 `giveaway` 方法获取免费衬衫得主所喜爱的颜色(如有),并返回其获得的衬衫的颜色。初始代码如示例 13-1 所示:
有很多种方式来实现这一点。例如,使用有 `Red``Blue` 两个成员的 `ShirtColor` 枚举(出于简单考虑限定为两种颜色)。我们使用 `Inventory` 结构体来代表公司的库存,它有一个类型为 `Vec<ShirtColor>``shirts` 字段表示库存中的衬衫的颜色。`Inventory` 上定义的 `giveaway` 方法获取免费衬衫得主所喜爱的颜色(如有),并返回其获得的衬衫的颜色。初始代码如示例 13-1 所示:
<span class="filename">文件名src/main.rs</span>
@ -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<T>` 上的 `unwrap_or_else` 方法的定义:

@ -1,4 +0,0 @@
## 中英文对照
- high-level: 高层
- low-level: 底层
Loading…
Cancel
Save