Merge pull request #693 from TeCHiScy/patch-7

Update ch13-01-closures.md
This commit is contained in:
KaiserY 2023-01-29 23:11:19 +08:00 committed by GitHub
commit f4b384bb11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -141,7 +141,7 @@ let add_one_v4 = |x| x + 1 ;
一旦闭包捕获了定义它的环境中一个值的引用或者所有权(也就影响了什么会被移 _进_ 闭包,如有),闭包体中的代码定义了稍后在闭包计算时对引用或值如何操作(也就影响了什么会被移 _出_ 闭包,如有)。闭包体可以做以下任何事:将一个捕获的值移出闭包,修改捕获的值,既不移动也不修改值,或者一开始就不从环境中捕获值。
闭包捕获和处理环境中的值的方式影响闭包实现的 trait。Trait 是函数和结构体指定它们能用的闭包的类型的方式。取决于闭包体如何处理值,闭包自动、渐进地实现一个、两个或三个 `Fn` trait。
闭包捕获和处理环境中的值的方式影响闭包实现的 trait。Trait 是函数和结构体指定它们能用的闭包的类型的方式。取决于闭包体如何处理值,闭包自动、渐进地实现一个、两个或三个 `Fn` trait。
1. `FnOnce` 适用于能被调用一次的闭包,所有闭包都至少实现了这个 trait因为所有闭包都能被调用。一个会将捕获的值移出闭包体的闭包只实现 `FnOnce` trait这是因为它只能被调用一次。
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。