三、控制流
Published on
分支语句(if-else)
分支语句if-else的用法基本与其它语言相同。
// 单独使用if,使用if-else,或者使用if-else if-else等均可
if n < 0 {
print!("{} is negative", n);
} else if n > 0 {
print!("{} is positive", n);
} else {
print!("{} is zero", n);
}
// if-else语句是表达式,可以作为值使用,但是所有分支的返回值类型必须相同
let big_n =
if n < 10 && n > -10 {
println!(", and is a small number, increase ten-fold");
10 * n
} else {
println!(", and is a big number, halve the number");
n / 2
};
循环语句
无限循环(loop)
无限循环语句,只能使用break或return退出。
let mut count = 0u32;
loop {
count += 1;
if count == 5 {
println!("OK, that's enough");
// 使用break退出
break;
}
}
loop语句可以作为表达式,通过使用break返回值。
let result = loop {
counter += 1;
if counter == 10 {
// 使用break返回值
break counter * 2;
}
};
条件循环(while)
在条件为真时循环。
let mut number = 3;
while number != 0 {
println!("{number}!");
number -= 1;
}
迭代循环(for)
对一个迭代器的全部值进行迭代循环。
let a = [10, 20, 30, 40, 50];
for element in a {
println!("the value is: {element}");
}
多重循环与标签
可以为循环定义标签,这样在多重循环中,就可以使用break或continue跳出多重循环。
'outer: loop {
println!("Entered the outer loop");
'inner: loop {
println!("Entered the inner loop");
// 此break只退出内层循环
break;
// 此break退出外层循环
break 'outer;
}
}
模式匹配
match
列出所有可能的分支,并从中选择匹配的分支执行。类似C中的switch语句,但是更加安全与强大。
let number = 13;
match number {
// 匹配一个值
1 => println!("One!"),
// 匹配多个值
2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
// 匹配一个范围
13..=19 => println!("A teen"),
// 匹配其它所有情况
_ => println!("Ain't special"),
}
if-let
在一些简单的情况下,使用match会使代码变得复杂,不易阅读。此时使用if-let更加简洁。
// 只处理一个分支
if let Some(i) = number {
println!("Matched {:?}!", i);
}
// 处理一个分支以及其它所有情况
if let Some(i) = letter {
println!("Matched {:?}!", i);
} else {
println!("Didn't match a number. Let's go with a letter!");
}
while-let
与if-let类似,用于循环语句中。
let-else
如果模式能够匹配则使用let进行绑定,否则执行一个发散函数(break, return, panic!)
let Ok(count) = u64::from_str(count_str) else {
panic!("Can't parse integer: '{count_str}'");
};