Rust 2.10 循环
11 Jan 2015 by LelouchHe
循环是Rust中最后一个基础结构.Rust有2个关于循环的方式: for
和while
.
for
for
用来循环一定次数.然而,Rust的for
有些不同.它不像是那些类似C的for
循环:
for (x = 0; x < 10; x++) {
printf("%d\n", x);
}
相反,Rust的for
是这样的:
for x in range(0, 10) {
println!("{}", x);
}
更通用的是:
for var in expression {
code
}
此处的表达式是迭代器(iterator),后面我们会详述.迭代器返回一系列值.每个值都是循环中的一次迭代.这个值会绑定到var
上,然后可以在循环体中使用.一旦循环体结束,又会从迭代器中取下一个值,然后继续循环.当没有更多的值,for
循环就结束了.
在例子中,range
的参数是一对上下界,返回遍历这个范围的迭代器.上界是在范围之外的,所以我们的循环输出0到9,而不是10.
Rust是专门不包含C式的循环的.手动操作迭代器的元素是复杂易错的,即使对于有经验的C程序员而言.
以后我们还会介绍迭代器的.
while
另一种循环是while
.如下:
let mut x = 5u;
let mut done = false;
while !done {
x += x - 3;
println!("{}", x);
if x % 5 == 0 {
done = true;
}
}
当你不知道要循环多少次的时候,while
是正确的选择.
如果你需要无限循环的话,你也许会这样:
while true {
}
但,Rust特意提供了一个关键字loop
,来表示这个:
loop {
}
Rust的控制流分析处理这个和while true
时略有区别,因为我们知道这个是无限循环.这究竟什么意思,现在并不重要,重要的是,我们提供给编译器的信息越多,编译器就能更安全的生成代码,所以当药无限循环时,最好优先选择loop
.
提前结束循环
回顾下刚才的while
循环:
let mut x = 5u;
let mut done = false;
while !done {
x += x - 3;
println!("{}", x);
if x % 5 == 0 {
done = true;
}
}
我们不得不单独使用一个bool
的可变变量done
,来表明什么时候要结束循环.Rust提供了2个改变循环过程的关键字:break
和continue
.
在这个例子里,我们可以用break
来重写:
let mut x = 5u;
loop {
x += x - 3;
println!("{}", x);
if x % 5 == 0 {
break;
}
}
现在我们可以使用loop
循环,用break
提前跳出.
continue
类似,但它不是解决循环,而是马上开始下一轮循环:
for x in range(0, 10) {
if x % 2 == 0 {
continue;
}
println!("{}", x);
}
continue
和break
都可以在while
和for
循环中使用.