5.5 if
Rust 对if的操作并不复杂,但是你会发现它更像一个动态类型语言,而不是一个传统的系统语言.让我们看看你是否知道这其中的微妙之处.
if是一个非常常见的概念的一个特定表述,"分支".这个名字来自于树的分支:一个决策点,多条路径可供选择.
在if的分支,是两条路的一种选择:
let x = 5;
if x == 5 {
println!("x is five!");
}
如果我们改变了x的值,这行字就不会被打印.更特别的,如果if后面的表达式是true,那么代码块就会被执行.如果是false,就不会.
如果你想要false分支执行,使用else:
let x = 5;
if x == 5 {
pinrtln!("x is five");
} else {
println!("x is not five :(");
}
如果有多余一个分支,可用另一个else if:
let x = 5;
if x == 5 {
println!("x is five!");
} else if x == 6 {
println!("x is six!");
} else {
println!("x is not five or six :(");
}
这些都很标准,然而,你也可以这样:
let x = 5;
let y = if x == 5 {
10
} else {
15
}; // y: i32
你也可以写成这样:
let x = 5;
let y = if x == 5 { 10 } else { 15 }; // y: i32
因为if是一个表达式,所以这样写可以工作.表达式的值就是表达式最后一行的值.一个没有else的if永远返回一个().
5.6 for 循环
循环用来循环一个特定的次数.然而,Rust的循环和其他系统语言的循环有点不一样.Rust的循环不想C风格的循环:
for (x = 0; x < 10; x++) {
printf( "%d\n", x );
}
而是:
for x in 0..10 {
println!("{}", x); // x: i32
}
更抽象的形式:
for var in expression {
code
}
这个expression是一个迭代器.迭代器返回一系列的元素.每个元素就是循环的一个迭代.这个值会绑定到var上,它在循环体中都是可用的.一旦循环体结束了,下一个值就会从迭代器中被取出,我们就再次循环.当没有值了的时候,for循环就结束了.
在我们的例子中,0..10就是一个代表了开始和结束的表达式,然后给每一个值一个迭代器.上限是开区间,所以我们的循环只会打印0到9,没有10.
Rust没有C风格的循环是有目的的.手动控制循环中的每一个元素是很复杂的并且容易出bug,甚至对于很有经验的C程序员.
5.7 while 循环
Rust也有一个while循环.看起来像这样:
let mut x = 5; // mut x: i32
let mut done = false; // mut done: bool
while !done {
x += x - 3;
println!("{}", x);
if x % 5 == 0 {
done = true;
}
}
我们需要维护一个mut 布尔变量绑定,done,来告诉我们什么时候结束while循环.Rust有两种方法通知迭代器: break和continue.
在此例中,我们可以用break来重写循环:
let mut x = 5;
loop {
x += x - 3;
println!("{}", x);
if x % 5 == 0 { break; }
}
我们以后会一直使用loop和break来写循环.
continue也很相似,但不是结束循环,而是进入下一个迭代中.此例只打印出奇数:
for x in 0..10 {
if x % 2 == 0 { continue; }
println!("{}", x);
}
continue和break适用于while和for循环.