From dccd4f06bb518f50f3ac5c23042072cc3743fd6e Mon Sep 17 00:00:00 2001 From: Unisko PENG Date: Tue, 25 Apr 2023 14:29:21 +0800 Subject: [PATCH] Improved Ch13 --- projects/closure_demo/src/main.rs | 4 ++-- ...ctional_Language_Features_Iterators_and_Closures.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/projects/closure_demo/src/main.rs b/projects/closure_demo/src/main.rs index 974f605..abb86af 100644 --- a/projects/closure_demo/src/main.rs +++ b/projects/closure_demo/src/main.rs @@ -10,7 +10,7 @@ struct Inventory { impl Inventory { fn giveaway( - &self, + &self, user_preference: Option ) -> ShirtColor { user_preference.unwrap_or_else(|| self.most_stocked()) @@ -43,7 +43,7 @@ fn main() { let user_pref1 = Some(ShirtColor::Red); let giveaway1 = store.giveaway(user_pref1); println! ( - "选项为 {:?} 的用户,得到了 {:?}", + "选项为 {:?} 的用户,得到了 {:?}", user_pref1, giveaway1 ); diff --git a/src/Ch13_Functional_Language_Features_Iterators_and_Closures.md b/src/Ch13_Functional_Language_Features_Iterators_and_Closures.md index 5ae5862..5c490ea 100644 --- a/src/Ch13_Functional_Language_Features_Iterators_and_Closures.md +++ b/src/Ch13_Functional_Language_Features_Iterators_and_Closures.md @@ -18,7 +18,7 @@ Rust 的设计曾受到许多现有的语言和技术的启发,而一个显著 **Closures: Anonymous Functions that Capture Their Environment** -Rust 的闭包,是咱们可将其保存在变量中,或将其作为参数传递给其他函数的匿名函数。咱们可在一处创建出闭包,随后在别处调用该闭包,而在不同上下文中执行他,evaluate it。与函数不同,闭包可捕获到他们于其中被定义作用域的值。随后咱们将演示这些闭包特性,怎样实现代码重用与行为定制,unlike functions, closures can capture values from the scope in which they're defined. We'll demonstrate how these closure features allow for code reuse and behavior customization。 +Rust 的闭包,是一些咱们可将其保存在变量中,或将其作为参数传递给其他函数的匿名函数。咱们可在一处创建出闭包,随后在别处调用该闭包,而在不同上下文中执行他,evaluate it。与函数不同,闭包可捕获到他们于其中被定义作用域的值。随后咱们将演示这些闭包特性,怎样实现代码重用与行为定制,unlike functions, closures can capture values from the scope in which they're defined. We'll demonstrate how these closure features allow for code reuse and behavior customization。 ### 使用闭包捕获环境 @@ -90,13 +90,13 @@ fn main() { *清单 13-1:体恤衫公司派发情形* -定义在 `main` 中的 `store`,有着两件蓝色 T 恤与一件红色 T 恤剩下,用于本次限量版促销活动。这里分别对选项为红色 T 恤及蓝色 T 恤的用户,调用了那个 `giveaway` 方法。 +定义在 `main` 中的 `store`,剩下两件蓝色 T 恤与一件红色 T 恤,用于本次限量版促销活动。咱们分别对选项为红色 T 恤,与没有偏好的两名用户,调用了 `giveaway` 方法。 -再次说明,此代码可以许多方式实现,而这里,为着重于闭包特性,因此除开其中用到闭包的那个 `giveaway` 的函数体,这里仍立足于咱们已经学过的那些概念。在那个 `giveaway` 方法中,这里以一个类型为 `Option` 的参数,而获取到用户选项,并在 `user_preference` 上调用了 `unwrap_or_else` 方法。这个 [`Option` 上的 `unwrap_or_else` 方法](https://doc.rust-lang.org/std/option/enum.Option.html#method.unwrap_or_else) 是定义在标准库中的。他会取两个参数:一个不带任何参数的、返回值 `T` (与 `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` 方法](https://doc.rust-lang.org/std/option/enum.Option.html#method.unwrap_or_else) 是由标准库定义的。他取一个参数:不带任何参数,返回一个值 `T` (与 `Option` 的 `Some` 变种中存储的同一类型,此示例中即 `ShirtColor`)的闭包。在 `Option` 为 `Some` 变种时,`unwrap_or_else` 就会返回 `Some` 里的那个值。而在 `Option` 为 `None` 变种时,那么 `unwrap_or_else` 就会调用随后的闭包,并返回由该闭包所返回的值。 -这里是将那个闭包表达式(closure expression) `|| self.most_stocked()`,作为参数传递给 `unwrap_or_else` 的。这是一个本身不取参数的闭包(如该闭包有参数,那么那些参数就会出现在那两条竖线之间)。该闭包的函数体调用了 `self.most_stocked()`。这里于这个地方对该闭包进行定义,进而 `unwrap_or_else` 的实现就会在需要其结果时,执行这个闭包。 +咱们指定了闭包表达式,closure expression, `|| self.most_stocked()`,作为 `unwrap_orelse` 的参数。这是个本身不取参数的闭包(如闭包有参数,参数就应出现在两条竖线之间)。该闭包的主体调用了 `self.most_stocked()`。咱们于此处定义出该闭包,而 `unwrap_or_else` 的实现就会在需要其结果时,执行这个闭包。 -运行此代码将会打印出: +运行此代码会打印出: ```console