流程控制
判断
if
Rust的if语句需要注意以下两点:
- if是表达式,而不是语句。
- 判断条件不需要用小括号括起来。
// if
if expr1 {
}
// if-else
if expr1 {
} else {
}
// if-(else if)-else
if expr1 {
} else if exprN { // 允许多个 else if
} else {
}
要注意 if 语句后没有括号(...),
另外 if 的判断表达式必须是个boolean类型的,否则编译不通过。
条件表达式
Rust不通过三元运算表达式 ? = ,因为可以直接依靠if语句的能力,直接返回表达式。
例:基于if语句的表达式
let x = 5;
let y = if x == 5 {
10
} else {
15
};
或者,直接压缩成一行:
let x = 5;
let y = if x == 5 { 10 } else { 15 }; // y: i32
需要注意,let if语句的不同分支必须返回相同数据类型,否则无法通过编译。
例:如下代码片段无法编译通过。
let number = if condition {
5
} else {
"six"
}
必须是如下两种方式之一。
let number = if condition {
5
} else {
6
}
let number = if condition {
"five"
} else {
"six"
}
match
Rust没有switch,但有强大的match,可以方便的提供模式匹配。这与Scala非常相似。
let x = 5;
match x {
1 => println!("one"),
2 => println!("two"),
3 => println!("three"),
4 => println!("four"),
5 => println!("five"),
_ => println!("something else"),
}
更多关于match的使用,参看“模式匹配”。
循环
for
Rust中的for用于遍历迭代器。这与Python一致。
for var in iterator {
// code
}
例:打印 0~9。
for x in 0..10 {
println!("{}", x);
}
例:反序打印0~9。
for x in (0..10).rev() {
println!("{}", x);
}
在遍历的过程中,若需要获取索引值,只需要对集合调用enumerate()函数即可。
例:使用enumerate函数,打印索引值与数值。
for (i,j) in (5..10).enumerate() {
println!("i = {} and j = {}", i, j);
}
打印输出:
i = 0 and j = 5
i = 1 and j = 6
i = 2 and j = 7
i = 3 and j = 8
i = 4 and j = 9
例:打印出 行号与行内容。
let lines = "Content of line one
Content of line two
Content of line three
Content of line four".lines();
for (linenumber, line) in lines.enumerate() {
println!("{}: {}", linenumber, line);
}
打印输出:
0: Content of line one
1: Content of line two
2: Content of line three
3: Content of line four
while
Rust中的while与其他语言中的while一致。唯一需要注意的是,条件表达式不需要括号。
while expression {
// code
}
loop
Rust中的loop用于方便实现无限循环。
loop {
// cide
}
该段代码等价于:
while true {
// code
}
例:
let mut x = 5;
let mut done = false;
while !done {
x += x - 3;
println!("{}", x);
if x % 5 == 0 {
done = true;
}
}
break 与 continue
跳出循环:
- break 跳出当前循环。
- continue 带到当前循环的下一次迭代。
例:
let mut x = 5;
loop {
x += x - 3;
println!("{}", x);
if x % 5 == 0 { break; }
}
label
与Java中的label一致。label用于在循环中跳到指定位置。
'outer: for x in 0..10 {
'inner: for y in 0..10 {
if x % 2 == 0 { continue 'outer; } // continues the loop over x
if y % 2 == 0 { continue 'inner; } // continues the loop over y
println!("x: {}, y: {}", x, y);
}
}