Merge pull request #686 from TeCHiScy/patch-4

Update ch13-01-closures.md
This commit is contained in:
KaiserY 2023-01-24 13:08:31 +08:00 committed by GitHub
commit 1fb516a1d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -139,7 +139,7 @@ let add_one_v4 = |x| x + 1 ;
### 将被捕获的值移出闭包和 `Fn` trait
一旦闭包捕获了它被定义的环境中一个值的引用或者所有权也就影响了什么会被移_进_闭包如有)闭包体中的代码定义了稍后在闭包计算时对引用或值如何操作也就影响了什么会被移_出_闭包如有。闭包体可以做以下任何事将一个捕获的值移出闭包修改捕获的值既不移动也不修改值或者一开始就不从环境中捕获值。
一旦闭包捕获了定义的环境中一个值的引用或者所有权(也就影响了什么会被移 _进_ 闭包,如有),闭包体中的代码定义了稍后在闭包计算时对引用或值如何操作(也就影响了什么会被移 _出_ 闭包,如有)。闭包体可以做以下任何事:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获值。
闭包捕获和处理环境中的值的方式影响闭包实现的 trait。Trait 是函数和结构体指定它们能用的的闭包的类型的方式。取决于闭包体如何处理值,闭包自动、渐进地实现一个、两个或三个 `Fn` trait。
@ -199,7 +199,7 @@ impl<T> Option<T> {
<span class="caption">示例 13-8尝试在 `sort_by_key` 上使用一个 `FnOnce` 闭包</span>
这是一个刻意构造的、繁琐的方式,它尝试统计 `sort_by_key` 在排序 `list`被调用的次数(并不能工作)。该代码尝试在闭包的环境中向 `sort_operations` vector 放入 `value`— 一个 `String` 来实现计数。闭包捕获了 `value` 然后通过转移 `value` 的所有权的方式将其移出闭包给到 `sort_operations` vector。这个闭包可以被调用一次;尝试调用它第二次将报错,因为这时 `value` 已经不在闭包的环境中,因而无法被再次放到 `sort_operations` 中!因而,这个闭包只实现了 `FnOnce`。由于要求闭包必须实现 `FnMut`,因此尝试编译这个代码将得到报错:`value` 不能被移出闭包:
这是一个刻意构造的、繁琐的方式,它尝试统计排序 `list` `sort_by_key` 被调用的次数(并不能工作)。该代码尝试在闭包的环境中向 `sort_operations` vector 放入 `value`— 一个 `String` 来实现计数。闭包捕获了 `value` 然后通过转移 `value` 的所有权的方式将其移出闭包给到 `sort_operations` vector。这个闭包可以被调用一次,尝试再次调用它将报错。因为这时 `value` 已经不在闭包的环境中,无法被再次放到 `sort_operations` 中!因而,这个闭包只实现了 `FnOnce`。由于要求闭包必须实现 `FnMut`,因此尝试编译这个代码将得到报错:`value` 不能被移出闭包:
```console
{{#include ../listings/ch13-functional-features/listing-13-08/output.txt}}
@ -215,6 +215,6 @@ impl<T> Option<T> {
<span class="caption">示例 13-9允许在 `sort_by_key` 上使用一个 `FnMut` 闭包</span>
当定义或使用用到闭包的函数或类型时,`Fn` trait 十分重要。在下个小节中,我们将会讨论迭代器。许多迭代器方法都接收闭包参数,因而在继续前先住这些闭包的细节!
当定义或使用用到闭包的函数或类型时,`Fn` trait 十分重要。在下个小节中,我们将会讨论迭代器。许多迭代器方法都接收闭包参数,因而在继续前先住这些闭包的细节!
[unwrap-or-else]: ../std/option/enum.Option.html#method.unwrap_or_else