From b95f3b404a74e48c57e8d4cb57e3805589664ccd Mon Sep 17 00:00:00 2001 From: TeCHiScy Date: Sun, 22 Jan 2023 17:35:31 +0800 Subject: [PATCH] Update ch13-01-closures.md --- src/ch13-01-closures.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ch13-01-closures.md b/src/ch13-01-closures.md index 13c7432..f756a46 100644 --- a/src/ch13-01-closures.md +++ b/src/ch13-01-closures.md @@ -20,11 +20,11 @@ Rust 的 **闭包**(*closures*)是可以保存在一个变量中或作为参 示例 13-1:衬衫公司赠送场景 -`main` 函数中定义的 `store` 还剩有两件蓝衬衫和一件红衬衫可供限量赠送。我们用一个期望获得红衬衫和一个没有期望的用户来调用 `giveaway` 方法。 +`main` 函数中定义的 `store` 还剩有两件蓝衬衫和一件红衬衫可在限量版促销活动中赠送。我们用一个期望获得红衬衫和一个没有期望的用户来调用 `giveaway` 方法。 -这段代码也可以有多种实现方法,而这里为了专注于闭包。我们会坚持使用已经学习过的概念,除了 `giveaway` 方法体中使用了闭包。`giveaway` 方法中获取了 `Option` 类型作为用户的期望颜色并在 `user_preference` 上调用 `unwrap_or_else`。 [`Option` 上的方法 `unwrap_or_else`][unwrap-or-else] 由标准库。它获取一个参数:一个没有任何参数并返回一个值(与 `Option` 的 `Some` 成员所存储的类型一样,在这里是 `ShirtColor`)的闭包。如果 `Option` 是 `Some` 成员,`unwrap_or_else` 返回 `Some` 中的值。如果 `Option` 是 `None` 成员,`unwrap_or_else` 调用闭包并返回闭包的返回值。 +这段代码也可以有多种实现方法。这里为了专注于闭包,我们会坚持使用已经学习过的概念,除了 `giveaway` 方法体中使用了闭包。`giveaway` 方法获取了 `Option` 类型作为用户的期望颜色并在 `user_preference` 上调用 `unwrap_or_else` 方法。 [`Option` 上的方法 `unwrap_or_else`][unwrap-or-else] 由标准库定义,它获取一个没有参数、返回值类型为 `T` (与 `Option` 的 `Some` 成员所存储的值的类型一样,这里是 `ShirtColor`)的闭包作为参数。如果 `Option` 是 `Some` 成员,则 `unwrap_or_else` 返回 `Some` 中的值。 如果 `Option` 是 `None` 成员, 则 `unwrap_or_else` 调用闭包并返回闭包的返回值。 -我们指定闭包表达式 `|| self.most_stocked()` 作为 `unwrap_or_else` 的参数。这是一个本身不获取参数的闭包(如果闭包有参数,它们会出现在两道竖杠之间)。闭包体调用了 `self.most_stocked()`。我们在这里定义了闭包,而 `unwrap_or_else` 的实现会在之后需要其结果的时候执行闭包。 +我们将被闭包表达式 `|| self.most_stocked()` 用作 `unwrap_or_else` 的参数。这是一个本身不获取参数的闭包(如果闭包有参数,它们会出现在两道竖杠之间)。闭包体调用了 `self.most_stocked()`。我们在这里定义了闭包,而 `unwrap_or_else` 的实现会在之后需要其结果的时候执行闭包。 运行代码会打印出: @@ -32,7 +32,8 @@ Rust 的 **闭包**(*closures*)是可以保存在一个变量中或作为参 {{#include ../listings/ch13-functional-features/listing-13-01/output.txt}} ``` -这里一个有趣的地方是我们传递了一个会在当前 `Inventory` 实例上调用 `self.most_stocked()` 的闭包。标准库并不需要知道我们定义的 `Inventory` 或 `ShirtColor` 类型。闭包捕获了一个 `Inventory` 实例的不可变引用到 `self`,并连同其它代码传递给 `unwrap_or_else` 方法。另一方面,函数则不能如此捕获其环境。 + +这里一个有趣的地方是我们传递了一个会在当前 `Inventory` 实例上调用 `self.most_stocked()` 的闭包。标准库并不需要知道我们定义的 `Inventory` 或 `ShirtColor` 类型或是在这个场景下我们想要用的逻辑。闭包捕获了一个 `Inventory` 实例的不可变引用到 `self`,并连同其它代码传递给 `unwrap_or_else` 方法。相比之下,函数就不能以这种方式捕获其环境。 ### 闭包类型推断和注解