做出判断并重复执行任务

RustBeginner
立即练习

简介

当程序能够在多个选项之间做出选择,并针对多个值重复计算时,程序才真正有用。Rust 使用布尔条件做出判断,并使用循环控制重复执行。

在本实验中,你将完成一个预先准备好的运输摘要,其中包含四个小部分。每个步骤只修改一个指定的表达式:一个比较表达式、两个分支结果、一个累计总和表达式,以及一个接收条件。

创建布尔比较

在此步骤中,你将把包裹重量与一个限制值进行比较,并保存比较结果(真或假)。

进入预先准备好的项目并打开源文件:

cd /home/labex/project/shipping-summary
nano src/main.rs

比较运算符 == 用于判断两个值是否相等。这不同于前面用于存储或赋值的单个 =。当前的比较结果为假,因为 12 不等于 10。在这份报告中,当包裹重量大于限制值时,包裹才算重。

在 Step 1 所在行中,只将 == 替换为大于运算符 >:

    let is_heavy = package_weight > heavy_limit; // Step 1

比较结果为布尔值 true,并存储在 is_heavy 中。按 Ctrl+O 保存,按 Enter 确认,然后按 Ctrl+X 退出。运行程序:

cargo run --quiet

现在,程序的第一行应该是:

Heavy package: true

使用 If 表达式选择值

在此步骤中,你将使用 if 表达式选择运输标签。

if 会检查一个布尔条件。当条件为 true 时,Rust 执行第一个代码块;否则执行 else 代码块。在 Rust 中,if 可以是一个表达式,并产生一个值。这里的两个分支都会产生文本,因此可以将选中的文本赋值给 shipping_label。由于整个 if 表达式会成为一个存储的值,因此两个分支必须产生兼容的类型。

打开文件:

nano src/main.rs

在 Step 2 所在行中,将第一个 "unknown" 替换为 "Freight",将第二个替换为 "Standard":

    let shipping_label = if is_heavy { "Freight" } else { "Standard" }; // Step 2

Rust 不要求在条件外加括号。花括号清楚地分隔了两种可能的结果。

保存并退出,然后运行报告:

cargo run --quiet

由于 is_heavy 的值为 true,第二行应该是:

Shipping label: Freight

使用 For 循环累加值

在此步骤中,你将使用一个有界的 for 循环和一个包含端点的范围来计算累计总和。

范围 3..=6 表示从 3 到 6 的整数,并且包含两个端点。for 循环会按顺序取出该范围中的每个值,并在循环体内暂时将其命名为 weight。

可变变量 total_weight 从零开始。每次循环都应将当前的 weight 加到已有的总和上。

打开文件并找到 Step 3 所在行:

nano src/main.rs

只将 weight * 0 替换为 weight:

        total_weight = total_weight + weight; // Step 3

保存并退出,然后检查代码:

cargo check

运行报告:

cargo run --quiet

循环会计算 3 + 4 + 5 + 6,因此你应该看到:

Total weight: 18

在循环中做出判断

在此步骤中,你将把重复执行和条件判断结合起来,统计被接收的订单数量。

第二个循环同样会遍历 3 到 6 之间的重量。当订单重量小于或等于 5 时,该订单会被接收。运算符 <= 表示小于或等于。

打开文件并找到 Step 4 所在行:

nano src/main.rs

将临时比较条件 weight < 0 替换为:

        let is_accepted = weight <= 5; // Step 4

后面的 if 作为语句使用:当 is_accepted 为 true 时,代码块会增加计数器。这里没有 else,因为被拒绝的订单不需要执行任何操作。

保存并退出,然后运行完成后的报告:

cargo run --quiet

重量为 3、4 和 5 的订单会被接收,而重量为 6 的订单不会被接收。最终输出应该是:

Heavy package: true
Shipping label: Freight
Total weight: 18
Accepted orders: 3

总结

你创建了布尔比较,使用 if 表达式选择了一个值,使用 for 循环和包含端点的范围重复执行任务,维护了累计总和,并在循环中加入判断来统计符合条件的值。