13-循环
1.3.8 循环
在Rust中重复做某些事情可以使用3种构造来完成,即loop、while和for。在所有这些构造中,通常都包含关键字continue和break,分别允许你跳过和跳出循环。以下是一个使用循环的示例,相当于C语言中的while(true):
// loops.rs
fn main() {
let mut x = 1024;
loop {
if x < 0 {
break;
}
println!("{} more runs to go", x);
x -= 1;
}
}
loop表示无限循环。在上述代码中,我们简单地递减x的值,当它达到if条件x<0时,中断循环。在Rust中执行循环的一个额外特性是,能够使用名称标记循环代码块。这可以在你有两个或多个嵌套循环,并想要从它们中的任何一个中断的情况下使用,而不仅针对直接包含break语句的循环。以下是使用循环标签中断loop的示例:
// loop_labels.rs
fn silly_sub(a: i32, b: i32) -> i32 {
let mut result = 0;
'increment: loop {
if result == a {
let mut dec = b;
'decrement: loop {
if dec == 0 {
//直接从 'increment循环中断
break 'increment;
} else {
result -= 1;
dec -= 1;
}
}
} else {
result += 1;
}
}
result
}
fn main() {
let a = 10;
let b = 4;
let result = silly_sub(a, b);
println!("{} minus {} is {}", a, b, result);
}
在上述代码中,我们正在执行一种非常低效的减法操作,只是为了演示标签在嵌套循环中的使用方法。在内部'decrement标签中,当dec等于0时,可以传递一个标签来中断循环(这里是'increment),并且中断外部的'increment循环。
现在,让我们看看while循环。这个示例非常简单:
// while.rs
fn main() {
let mut x = 1000;
while x > 0 {
println!("{} more runs to go", x);
x -= 1;
}
}
Rust中也有关键字for,它类似于其他语言中使用的for循环,但它们的实现完全不同。Rust的for循环基本上是一种更强大的重复构造(迭代器)的语法糖。我们将在第7章详细地讨论它。简单地说,Rust中的for循环只适用于可以转换为迭代器的类型。一种这样的类型是Range类型。Range类型可以指代一系列数字,例如(0..10)。它们可以用于for循环,如下所示:
// for_loops.rs
fn main() {
//不包括10
print!("Normal ranges: ");
for i in 0..10 {
print!("{},", i);
}
println!(); //另起一行
print!("Inclusive ranges: ");
//开始计数直到10
for i in 0..=10 {
print!("{},", i);
}
}
一般的区间语法0..10,是不包括10的,Rust还具有包含区间的语法,例如0..=10,它会一直迭代到10才停止,如第2个for循环所示。现在,我们将开始讨论自定义数据类型。