前言
我们在上一张中已经学习了 Rust 中的控制流的一个重要组成部分:if...elseif...else,这一篇文章,我们会接触另一个重要的控制流:循环。我们一起来看看在 Rust 当中,都有哪些方式可以实现循环逻辑。
loop
我们做猜数游戏的时候,已经初步的接触到了 loop 循环了,简单来说,loop 就是在 Rust 当中,帮我们实现永续循环的利器。
loop关键字告诉 Rust 需要反复的执行一套代码,直到我们明确喊停为止。
我们直接来看一个 loop 的使用示例:
fn main() {
let mut count = 0;
let mut sum = 0;
loop {
sum += count;
if count == 10 {
// 跳出循环
break;
}
count += 1;
}
println!("sum is {}", sum);// 55
}
上面的程序中 loop 起到的作用就是一直执行 {} 中的代码累加 count,直到 count 累加到 10 的时候通过 break 关键字退出 loop 循环。
除了上面这种用法之外,loop 还有其他用法,例如可以通过 break 后面的表达式为 loop 添加返回值,这样,loop 就可以作为赋值语句的右值了。
let mut count = 0;
let sum = loop {
if count == 10 {
// 跳出循环
break count * 2;
}
count += 1;
};
println!("sum is {}", sum);
上面的代码,在 break 后加上了 count * 2 的表达式,也就是当 count 累加到 10 之后,就会跳出循环,并将 count * 2 的结果作为 loop 的返回值赋值给 sum。这种用法相信在其他语言中也是比较少见的,但在 Rust 当中是很常见的用法,就像我们上一个章节中的 if 语句,也可以作为复制语句的右值一样。
while
条件循环,每次进入循环体之前都需要判断一次条件。while 循环在各大语言当中基本都是支持的,用法也都差不多,我们直接来看一下在 Rust 当中的使用示例吧:
let mut count = 3;
while count != 0 {
println!("count is {}", count);
count -= 1;
}
println!("LIFTOFF!!!");
for
我们可以使用 while 或 loop 遍历集合或数组,但不仅写起来比较费劲,还比较低效。在集合、数组的遍历场景,我们跟推荐使用 for 循环进行遍历。
使用 for 循环遍历集合或数组更加简洁紧凑,它可以针对集合中的每一个元素执行相应的代码处理逻辑。
我们直接来看一下例子:
let a = [10, 20, 30, 40, 50];
for element in a.iter() {
println!("the value is {}", element);
}
看起来跟在 TS/JS 中的 for...of 有点像, 但也有不一样的,就是在循环数组时,需要调用一下数组的 iter() 方法,这个方法会返回一个可以遍历的数据。而前面的 element 每次都将会接受数组中的一个元素。
由于 for 循环的安全和简洁性,for 循环在 Rust 当中用的是最多的一种循环方式。
Range
针对上面我们使用 while 循环实现的倒计时的功能,实际上很多开发者都是用 for 循环来实现的。那么,用 for 循环要如何实现倒计时的功能呢?
此时我们就要借助 Range了,在 Rust 当中,我们可以使用 .. 两个点分隔的两个数字来表示一个区间范围的数字,注意,这个区间是左闭右开的,如:1..4 代表的是从 1 到 3,不包含 4。我们直接用 Range 和 for 来实现一下上线的倒计时程序看一下:
for element in 1..4 {
println!("count is {}", element);
}
println!("LIFTOFF!!!");
执行一下上述代码看看:
咦,好像跟刚刚不一样,刚刚是倒计时,现在是正计时了。那么,要如何实现跟上面一样的倒计时效果呢?在 Rust 当中,我们可以使用 rev 方法 Range 进行反转。
for element in (1..4).rev() {
println!("count is {}", element);
}
println!("LIFTOFF!!!");
上面这样修改了,我们再来执行一下:
发现结果就对了。
结语
看完了 Rust 当中各种循环的实现方式,相信你对 Rust 中如何循环遍历、循环执行代码已经有了比较明确的思路了。