|
|
@ -97,7 +97,7 @@ fn generate_workout(intensity: i32, random_number: i32) {
|
|
|
|
|
|
|
|
|
|
|
|
如果用户需要高强度锻炼,这里有一些额外的逻辑:如果 app 生成的随机数刚好是 3,app 相反会建议用户稍做休息并补充水分。如果不是,则用户会从复杂算法中得到数分钟跑步的高强度锻炼计划。
|
|
|
|
如果用户需要高强度锻炼,这里有一些额外的逻辑:如果 app 生成的随机数刚好是 3,app 相反会建议用户稍做休息并补充水分。如果不是,则用户会从复杂算法中得到数分钟跑步的高强度锻炼计划。
|
|
|
|
|
|
|
|
|
|
|
|
数据科学部门的同学告知我们必须对调用算法的方式做出一些改变。为了简化做出这些改变的更新,我们将重构代码来只调用 `simulated_expensive_calculation` 一次。同时还希望去掉目前多余的连续两次函数调用,并不希望在计算过程中增加任何其他此函数的调用。也就是说,我们不希望在完全无需其结果的情况调用函数,不过最终仍然需要调用函数一次。
|
|
|
|
数据科学部门的同学告知我们将来会对调用算法的方式做出一些改变。为了在要做这些改动的时候简化更新步骤,我们将重构代码来让它只调用 `simulated_expensive_calculation` 一次。同时还希望去掉目前多余的连续两次函数调用,并不希望在计算过程中增加任何其他此函数的调用。也就是说,我们不希望在完全无需其结果的情况调用函数,不过最终仍然需要调用函数一次。
|
|
|
|
|
|
|
|
|
|
|
|
有多种方法可以重构此程序。我们首先尝试的是将重复的慢计算函数调用提取到一个变量中,如示例 13-4 所示:
|
|
|
|
有多种方法可以重构此程序。我们首先尝试的是将重复的慢计算函数调用提取到一个变量中,如示例 13-4 所示:
|
|
|
|
|
|
|
|
|
|
|
@ -210,7 +210,7 @@ fn generate_workout(intensity: i32, random_number: i32) {
|
|
|
|
|
|
|
|
|
|
|
|
<span class="caption">示例 13-6:调用定义的 `expensive_closure`</span>
|
|
|
|
<span class="caption">示例 13-6:调用定义的 `expensive_closure`</span>
|
|
|
|
|
|
|
|
|
|
|
|
现在我们达成了将满计算统一到一个地方的目标,并只会在需要结果的时候执行改代码。然而,我们又重新引入了示例 13-3 中的问题:仍然在第一个 `if` 块中调用了闭包两次,这会调用慢计算两次并使用户多等待一倍的时间。可以通过在 `if` 块中创建一个本地变量存放闭包调用的结果来解决这个问题,不过正因为使用了闭包还有另一个解决方案。稍后会回到这个方案上;首先讨论一下为何闭包定义中和所涉及的 trait 中没有类型注解。
|
|
|
|
现在我们达成了将慢计算统一到一个地方的目标,并只会在需要结果的时候执行改代码。然而,我们又重新引入了示例 13-3 中的问题:仍然在第一个 `if` 块中调用了闭包两次,这会调用慢计算两次并使用户多等待一倍的时间。可以通过在 `if` 块中创建一个本地变量存放闭包调用的结果来解决这个问题,不过正因为使用了闭包还有另一个解决方案。稍后会回到这个方案上;首先讨论一下为何闭包定义中和所涉及的 trait 中没有类型注解。
|
|
|
|
|
|
|
|
|
|
|
|
### 闭包类型推断和注解
|
|
|
|
### 闭包类型推断和注解
|
|
|
|
|
|
|
|
|
|
|
@ -553,4 +553,4 @@ error[E0382]: use of moved value: `x`
|
|
|
|
|
|
|
|
|
|
|
|
大部分需要指定一个 `Fn` trait bound 的时候,可以从 `Fn` 开始,编译器会根据闭包体中的情况告诉你是否需要 `FnMut` 或 `FnOnce`。
|
|
|
|
大部分需要指定一个 `Fn` trait bound 的时候,可以从 `Fn` 开始,编译器会根据闭包体中的情况告诉你是否需要 `FnMut` 或 `FnOnce`。
|
|
|
|
|
|
|
|
|
|
|
|
为了展示闭包作为函数参数时捕获其环境的作用,让我们移动到下一个主题:迭代器。
|
|
|
|
为了展示闭包作为函数参数时捕获其环境的作用,让我们移动到下一个主题:迭代器。
|
|
|
|