Home

Rust 2.10 循环

11 Jan 2015 by LelouchHe

原文链接

循环是Rust中最后一个基础结构.Rust有2个关于循环的方式: forwhile.

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个改变循环过程的关键字:breakcontinue.

在这个例子里,我们可以用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);
}

continuebreak都可以在whilefor循环中使用.