$ cargo run Compiling branches v0.1.0 (file:///projects/branches) Finished dev [unoptimized + debuginfo] target(s) in 0.30s Running `target/debug/branches` The value of number is: 5
记住,代码块的值是其最后一个表达式的值,而数字本身就是一个表达式。在这个例子中,整个 if 表达式的值取决于哪个代码块被执行。这意味着 if 的每个分支的可能的返回值都必须是相同类型。
fnmain() { leta = [10, 20, 30, 40, 50]; letmut index = 0;
while index < 5 { println!("the value is: {}", a[index]);
index += 1; } }
数组中的 5 个元素全部都如期被打印出来。尽管 index 在某一时刻会到达值 5,不过循环在其尝试从数组获取第 6 个值(会越界)之前就停止了。
但是这个过程很容易出错;如果索引值或测试条件不正确会导致程序 panic。例如,如果将 a 数组的定义更改为包含 4 个元素,但忘记将条件更新为while index < 4,则代码会出现 panic。这也使程序更慢,因为编译器增加了运行时代码来对每次循环进行条件检查,以确定在循环的每次迭代中索引是否在数组的边界内。
作为更简洁的替代方案,可以使用 for 循环来对一个集合的每个元素执行一些代码。
例子:
1 2 3 4 5 6 7
fnmain() { leta = [10, 20, 30, 40, 50];
forelementin a { println!("the value is: {}", element); } }
for 循环的安全性和简洁性使得它成为 Rust 中使用最多的循环结构。即使是在想要循环执行代码特定次数时,例如示例 3-3 中使用 while 循环的倒计时例子,大部分 Rustacean 也会使用 for 循环。这么做的方式是使用 Range,它是标准库提供的类型,用来生成从一个数字开始到另一个数字之前结束的所有数字的序列。
下面是一个使用 for 循环来倒计时的例子,它还使用了一个我们还未讲到的方法,rev,用来反转区间(range):
// 华氏度和摄氏度换算 letmut temp = String::new(); println!("Please enter a temperature value with units(C/F): "); std::io::stdin().read_line(&mut temp).expect("Incorrect input format.");