mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-14 21:11:31 +08:00
Update ch13-01-closures.md
修正 typo
This commit is contained in:
parent
bc79854a2f
commit
74ef8e4773
@ -141,7 +141,7 @@ let add_one_v4 = |x| x + 1 ;
|
|||||||
|
|
||||||
一旦闭包捕获了定义它的环境中一个值的引用或者所有权(也就影响了什么会被移 _进_ 闭包,如有),闭包体中的代码定义了稍后在闭包计算时对引用或值如何操作(也就影响了什么会被移 _出_ 闭包,如有)。闭包体可以做以下任何事:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获值。
|
一旦闭包捕获了定义它的环境中一个值的引用或者所有权(也就影响了什么会被移 _进_ 闭包,如有),闭包体中的代码定义了稍后在闭包计算时对引用或值如何操作(也就影响了什么会被移 _出_ 闭包,如有)。闭包体可以做以下任何事:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获值。
|
||||||
|
|
||||||
闭包捕获和处理环境中的值的方式影响闭包实现的 trait。Trait 是函数和结构体指定它们能用的的闭包的类型的方式。取决于闭包体如何处理值,闭包自动、渐进地实现一个、两个或三个 `Fn` trait。
|
闭包捕获和处理环境中的值的方式影响闭包实现的 trait。Trait 是函数和结构体指定它们能用的闭包的类型的方式。取决于闭包体如何处理值,闭包自动、渐进地实现一个、两个或三个 `Fn` trait。
|
||||||
|
|
||||||
1. `FnOnce` 适用于能被调用一次的闭包,所有闭包都至少实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值移出闭包体的闭包只实现 `FnOnce` trait,这是因为它只能被调用一次。
|
1. `FnOnce` 适用于能被调用一次的闭包,所有闭包都至少实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值移出闭包体的闭包只实现 `FnOnce` trait,这是因为它只能被调用一次。
|
||||||
2. `FnMut` 适用于不会将捕获的值移出闭包体的闭包,但它可能会修改被捕获的值。这类闭包可以被调用多次。
|
2. `FnMut` 适用于不会将捕获的值移出闭包体的闭包,但它可能会修改被捕获的值。这类闭包可以被调用多次。
|
||||||
@ -163,11 +163,11 @@ impl<T> Option<T> {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
回忆 `T` 是表示 `Option` 中 `Some` 成员中的值的类型的范型。类型 `T` 也是 `unwrap_or_else` 函数的返回值类型:举例来说,在 `Option<String>` 上调用 `unwrap_or_else` 会得到一个 `String`。
|
回忆 `T` 是表示 `Option` 中 `Some` 成员中的值的类型的泛型。类型 `T` 也是 `unwrap_or_else` 函数的返回值类型:举例来说,在 `Option<String>` 上调用 `unwrap_or_else` 会得到一个 `String`。
|
||||||
|
|
||||||
接着注意到 `unwrap_or_else` 函数有额外的范型参数 `F`。 `F` 是 `f` 参数(即调用 `unwrap_or_else` 时提供的闭包)的类型。
|
接着注意到 `unwrap_or_else` 函数有额外的泛型参数 `F`。 `F` 是 `f` 参数(即调用 `unwrap_or_else` 时提供的闭包)的类型。
|
||||||
|
|
||||||
范型 `F` 的 trait bound 是 `FnOnce() -> T`,这意味着 `F` 必须能够被调用一次,没有参数并返回一个 `T`。在 trait bound 中使用 `FnOnce` 表示 `unwrap_or_else` 将最多调用 `f` 一次。在 `unwrap_or_else` 的函数体中可以看到,如果 `Option` 是 `Some`,`f` 不会被调用。如果 `Option` 是 `None`,`f` 将会被调用一次。由于所有的闭包都实现了 `FnOnce`,`unwrap_or_else` 能接收绝大多数不同类型的闭包,十分灵活。
|
泛型 `F` 的 trait bound 是 `FnOnce() -> T`,这意味着 `F` 必须能够被调用一次,没有参数并返回一个 `T`。在 trait bound 中使用 `FnOnce` 表示 `unwrap_or_else` 将最多调用 `f` 一次。在 `unwrap_or_else` 的函数体中可以看到,如果 `Option` 是 `Some`,`f` 不会被调用。如果 `Option` 是 `None`,`f` 将会被调用一次。由于所有的闭包都实现了 `FnOnce`,`unwrap_or_else` 能接收绝大多数不同类型的闭包,十分灵活。
|
||||||
|
|
||||||
> 注意:函数也可以实现所有的三种 `Fn` traits。如果我们要做的事情不需要从环境中捕获值,则可以在需要某种实现了 `Fn` trait 的东西时使用函数而不是闭包。举个例子,可以在 `Option<Vec<T>>` 的值上调用 `unwrap_or_else(Vec::new)` 以便在值为 `None` 时获取一个新的空的 vector。
|
> 注意:函数也可以实现所有的三种 `Fn` traits。如果我们要做的事情不需要从环境中捕获值,则可以在需要某种实现了 `Fn` trait 的东西时使用函数而不是闭包。举个例子,可以在 `Option<Vec<T>>` 的值上调用 `unwrap_or_else(Vec::new)` 以便在值为 `None` 时获取一个新的空的 vector。
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user