简介
当程序能够在多个选项之间做出选择,并针对多个值重复计算时,程序才真正有用。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 循环和包含端点的范围重复执行任务,维护了累计总和,并在循环中加入判断来统计符合条件的值。



