mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-09 08:51:18 +08:00
Update ch13-01-closures.md
This commit is contained in:
parent
7dc059f009
commit
c62d168620
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user