From 71749a5f1910c8a3ec56d8b98eda74f64ce558b2 Mon Sep 17 00:00:00 2001 From: focksor surooi Date: Mon, 26 Dec 2022 20:53:32 +0800 Subject: [PATCH] Update ch13-01-closures.md (#127) --- src/ch13-01-closures.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ch13-01-closures.md b/src/ch13-01-closures.md index 812105e..4fcd6e7 100644 --- a/src/ch13-01-closures.md +++ b/src/ch13-01-closures.md @@ -8,7 +8,7 @@ Rust 的 **闭包**(*closures*)是可以保存进变量或作为参数传递 考虑一下这个假定的场景:我们在一个通过 app 生成自定义健身计划的初创企业工作。其后端使用 Rust 编写,而生成健身计划的算法需要考虑很多不同的因素,比如用户的年龄、身体质量指数(Body Mass Index)、用户喜好、最近的健身活动和用户指定的强度系数。本例中实际的算法并不重要,重要的是这个计算只花费几秒钟。我们只希望在需要时调用算法,并且只希望调用一次,这样就不会让用户等得太久。 -这里将通过调用 `simulated_expensive_calculation` 函数来模拟调用假定的算法,如示例 13-1 所示,它会打印出 `calculating slowly...`,等待两秒,并接着返回传递给它的数字: +这里将通过调用 `simulated_expensive_calculation` 函数来模拟调用假定的算法,如示例 13-1 所示,它会打印出 `calculating slowly...`,等待两秒,并接着返回传递给它的数字。 文件名: src/main.rs @@ -165,7 +165,7 @@ let expensive_closure = |num| { 闭包定义是 `expensive_closure` 赋值的 `=` 之后的部分。闭包的定义以一对竖线(`|`)开始,在竖线中指定闭包的参数;之所以选择这个语法是因为它与 Smalltalk 和 Ruby 的闭包定义类似。这个闭包有一个参数 `num`;如果有多于一个参数,可以使用逗号分隔,比如 `|param1, param2|`。 -参数之后是存放闭包体的大括号 —— 如果闭包体只有一行则大括号是可以省略的。大括号之后闭包的结尾,需要用于 `let` 语句的分号。因为闭包体的最后一行没有分号(正如函数体一样),所以闭包体(`num`)最后一行的返回值作为调用闭包时的返回值 。 +参数之后是存放闭包体的大括号 —— 如果闭包体只有一行则大括号是可以省略的。在闭包的末尾,花括号之后,需要使用分号使 `let` 语句完整。因为闭包体的最后一行没有分号(正如函数体一样),所以闭包体(`num`)最后一行的返回值作为调用闭包时的返回值 。 注意这个 `let` 语句意味着 `expensive_closure` 包含一个匿名函数的 **定义**,不是调用匿名函数的 **返回值**。回忆一下使用闭包的原因是我们需要在一个位置定义代码,储存代码,并在之后的位置实际调用它;期望调用的代码现在储存在 `expensive_closure` 中。 @@ -347,11 +347,11 @@ impl Cacher 示例 13-10:`Cacher` 的缓存逻辑 -`Cacher` 结构体的字段是私有的,因为我们希望 `Cacher` 管理这些值而不是任由调用代码潜在的直接改变他们。 +`Cacher` 结构体的字段是私有的,因为我们希望 `Cacher` 管理这些值而不是任由调用代码潜在地直接改变他们。 `Cacher::new` 函数获取一个泛型参数 `T`,它定义于 `impl` 块上下文中并与 `Cacher` 结构体有着相同的 trait bound。`Cacher::new` 返回一个在 `calculation` 字段中存放了指定闭包和在 `value` 字段中存放了 `None` 值的 `Cacher` 实例,因为我们还未执行闭包。 -当调用代码需要闭包的执行结果时,不同于直接调用闭包,它会调用 `value` 方法。这个方法会检查 `self.value` 是否已经有了一个 `Some` 的结果值;如果有,它返回 `Some` 中的值并不会再次执行闭包。 +当调用代码需要闭包的执行结果时,不同于直接调用闭包,它会调用 `value` 方法。这个方法会检查 `self.value` 是否已经有了一个 `Some` 的结果值;如果有,它返回 `Some` 中的值而不会再次执行闭包。 如果 `self.value` 是 `None`,则会调用 `self.calculation` 中储存的闭包,将结果保存到 `self.value` 以便将来使用,并同时返回结果值。