====== 控制流 ======
===== 条件判断:if / else if / else =====
fn main() {
let score = 85;
if score >= 90 {
println!("优秀");
} else if score >= 60 {
println!("及格");
} else {
println!("不及格");
}
}
==== if 是表达式 ====
Rust 的 ''if'' 是表达式,可以返回值:
fn main() {
let condition = true;
let x = if condition { 5 } else { 6 };
println!("x = {}", x); // 5
}
注意:''if'' 和 ''else'' 分支的类型必须一致。
===== 循环 =====
==== loop:无限循环 ====
fn main() {
let mut count = 0;
loop {
count += 1;
if count >= 5 {
break count; // break 可返回值
}
};
println!("count = {}", count);
}
''loop'' 是唯一可以用 ''break'' 返回值的循环结构。
==== while:条件循环 ====
fn main() {
let mut n = 3;
while n > 0 {
println!("倒计时: {}", n);
n -= 1;
}
println!("发射!");
}
==== for:区间遍历 ====
最常用的循环方式:
fn main() {
// 1..5 是半开区间 [1, 5)
for i in 1..5 {
println!("{}", i); // 1, 2, 3, 4
}
// 1..=5 是闭区间 [1, 5]
for i in 1..=5 {
println!("{}", i); // 1, 2, 3, 4, 5
}
}
==== for 遍历集合 ====
fn main() {
let arr = [10, 20, 30, 40, 50];
// 遍历元素
for element in arr.iter() {
println!("{}", element);
}
// 遍历索引和元素
for (index, value) in arr.iter().enumerate() {
println!("arr[{}] = {}", index, value);
}
}
===== 循环控制关键字 =====
==== break ====
跳出当前循环:
fn main() {
let mut count = 0;
loop {
count += 1;
if count == 3 {
break;
}
}
println!("count = {}", count); // 3
}
==== continue ====
跳过当前迭代,继续下一次:
fn main() {
for i in 0..10 {
if i % 2 == 0 {
continue; // 跳过偶数
}
println!("{}", i); // 1, 3, 5, 7, 9
}
}
==== 循环标签 ====
多层循环嵌套时,用标签指定 ''break'' 或 ''continue'' 的目标:
fn main() {
'outer: for i in 1..=3 {
for j in 1..=3 {
if i == 2 && j == 2 {
break 'outer; // 跳出外层循环
}
println!("i={}, j={}", i, j);
}
}
// 输出: (1,1) (1,2) (1,3) (2,1)
}
===== match:模式匹配 =====
''match'' 是 Rust 最强大的控制流工具:
fn main() {
let number = 3;
match number {
1 => println!("一"),
2 | 3 => println!("二或三"), // 多模式匹配
4..=7 => println!("四到七"), // 范围匹配
_ => println!("其他"), // 通配符
}
}
==== match 表达式返回值 ====
fn main() {
let grade = 'A';
let score = match grade {
'A' => 95,
'B' => 85,
'C' => 75,
_ => 60,
};
println!("分数: {}", score);
}
===== if let 简洁匹配 =====
当只关心一个模式时,''if let'' 比 ''match'' 更简洁:
fn main() {
let option = Some(5);
// match 写法
match option {
Some(x) => println!("值是 {}", x),
None => (),
}
// if let 简洁写法
if let Some(x) = option {
println!("值是 {}", x);
}
}
也可以加 ''else'':
fn main() {
let option: Option = None;
if let Some(x) = option {
println!("值是 {}", x);
} else {
println!("没有值");
}
}
===== while let 循环匹配 =====
fn main() {
let mut stack = vec![1, 2, 3];
while let Some(top) = stack.pop() {
println!("{}", top); // 3, 2, 1
}
}
===== 本章实践:猜数字游戏 =====
use std::io;
fn main() {
println!("===== 猜数字游戏 =====");
let secret_number = 42; // 实际应用中应使用 rand 生成
loop {
println!("请输入你的猜测(1-100):");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("读取失败");
let guess: i32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("请输入有效数字!");
continue;
}
};
match guess {
g if g < secret_number => println!("太小了!"),
g if g > secret_number => println!("太大了!"),
_ => {
println!("猜对了!");
break;
}
}
}
}
===== 本章小结 =====
* ''if'' 是表达式,可以返回值
* ''loop'' 无限循环,''break'' 可返回值
* ''while'' 条件循环
* ''for'' 是首选的遍历方式
* 循环标签控制多层循环
* ''match'' 强大模式匹配,必须穷举所有分支
* ''if let'' 简洁匹配单个模式