“程序的逻辑就像河流,控制流决定了它的流向。” —— Rust开发者
控制流是编程的核心概念,它决定了程序的执行路径。Rust提供了丰富而强大的控制流结构,包括条件语句、循环、迭代器和闭包等。本章将深入探讨这些概念,帮助你编写更加优雅和高效的Rust代码。
学习目标
通过本章学习,你将掌握:
- 🎯 条件语句和模式匹配
- 🔄 各种循环结构的使用
- 🚀 迭代器的强大功能
- 📦 闭包的定义和应用
- ⚡ 函数式编程技巧
- 🛡️ 错误处理模式
6.1 条件语句
6.1.1 if表达式
Rust中的if是表达式,不是语句,这意味着它可以返回值。
fn main() {
println!("🎯 条件语句示例");
println!("===============");
// 基本if表达式
let number = 6;
if number % 4 == 0 {
println!("数字能被4整除");
} else if number % 3 == 0 {
println!("数字能被3整除");
} else if number % 2 == 0 {
println!("数字能被2整除");
} else {
println!("数字不能被4、3或2整除");
}
// if作为表达式
let condition = true;
let number = if condition { 5 } else { 6 };
println!("number的值是: {}", number);
// 复杂条件判断
let age = 25;
let has_license = true;
let has_car = false;
let can_drive = if age >= 18 && has_license {
if has_car {
"可以开车"
} else {
"有驾照但没有车"
}
} else {
"不能开车"
};
println!("驾驶状态: {}", can_drive);
// 使用if let进行模式匹配
let some_number = Some(7);
if let Some(x) = some_number {
println!("匹配到数字: {}", x);
} else {
println!("没有匹配到数字");
}
// 多重if let
let values = vec![Some(1), None, Some(3)];
for value in values {
if let Some(x) = value {
if x > 2 {
println!("找到大于2的值: {}", x);
} else {
println!("找到小于等于2的值: {}", x);
}
} else {
println!("找到None值");
}
}
demonstrate_advanced_conditions();
}
fn demonstrate_advanced_conditions() {
println!("\n高级条件判断:");
// 使用函数作为条件
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for num in &numbers {
let description = if is_even(*num) {
"偶数"
} else if is_prime(*num) {
"奇质数"
} else {
"奇合数"
};
println!("{} 是 {}", num, description);
}
// 条件链
let score = 85;
let grade = if score >= 90 {
'A'
} else if score >= 80 {
'B'
} else if score >= 70 {
'C'
} else if score >= 60 {
'D'
} else {
'F'
};
println!("分数 {} 对应等级 {}", score, grade);
// 复杂的布尔逻辑
let weather = "sunny";
let temperature = 25;
let has_umbrella = false;
let should_go_out = match weather {
"sunny" => temperature > 15 && temperature < 35,
"rainy" => has_umbrella,
"cloudy" => temperature > 10,
_ => false,
};
println!("是否应该出门: {}", should_go_out);
}
fn is_even(n: i32) -> bool {
n % 2 == 0
}
fn is_prime(n: i32) -> bool {
if n < 2 {
return false;
}
for i in 2..=(n as f64).sqrt() as i32 {
if n % i == 0 {
return false;
}
}
true
}
rustc conditional_basics.rs && ./conditional_basics
6.1.2 match表达式进阶
fn main() {
println!("🎯 高级match表达式");
println!("=================");
demonstrate_match_guards();
demonstrate_match_bindings();
demonstrate_match_ranges();
demonstrate_match_destructuring();
}
fn demonstrate_match_guards() {
println!("\n守卫条件:");
let pair = (2, -2);
match pair {
(x, y) if x == y => println!("这些是双胞胎"),
(x, y) if x + y == 0 => println!("反义词!"),
(x, _) if x % 2 == 1 => println!("第一个是奇数"),
_ => println!("没有相关性..."),
}
// 复杂守卫条件
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for num in numbers {
let description = match num {
x if x % 15 == 0 => "FizzBuzz",
x if x % 3 == 0 => "Fizz",
x if x % 5 == 0 => "Buzz",
x if x > 7 => "大数",
_ => "普通数",
};
println!("{}: {}", num, description);
}
}
fn demonstrate_match_bindings() {
println!("\n绑定匹配:");
#[derive(Debug)]
enum Message {
Hello { id: i32 },
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
let msg = Message::ChangeColor(0, 160, 255);
match msg {
Message::Hello { id: id_variable @ 3..=7 } => {
println!("找到一个在范围内的id: {}", id_variable);
}
Message::Hello { id: 10..=12 } => {
println!("找到另一个范围内的id");
}
Message::Hello { id } => {
println!("找到其他id: {}", id);
}
Message::Move { x, y } => {
println!("移动到坐标 ({}, {})", x, y);
}
Message::Write(text) => {
println!("文本消息: {}", text);
}
Message::ChangeColor(r, g, b) => {
println!("改变颜色为红: {}, 绿: {}, 蓝: {}", r, g, b);
}
}
// @ 绑定
let point = (3, 5);
match point {
p @ (x, y) if x > 0 && y > 0 => {
println!("点 {:?} 在第一象限", p);
}
(x, y) if x < 0 && y > 0 => {
println!("点在第二象限");
}
(x, y) if x < 0 && y < 0 => {
println!("点在第三象限");
}
(x, y) if x > 0 && y < 0 => {
println!("点在第四象限");
}
_ => println!("点在坐标轴上"),
}
}
fn demonstrate_match_ranges() {
println!("\n范围匹配:");
let x = 5;
match x {
1..=5 => println!("一到五"),
6..=10 => println!("六到十"),
11..=20 => println!("十一到二十"),
_ => println!("其他"),
}
// 字符范围
let letter = 'c';
match letter {
'a'..='j' => println!("早期字母"),
'k'..='z' => println!("后期字母"),
_ => println!("其他字符"),
}
// 多个范围
let age = 25;
let category = match age {
0..=2 => "婴儿",
3..=12 => "儿童",
13..=19 => "青少年",
20..=39 => "青年",
40..=59 => "中年",
60..=79 => "老年",
80..=120 => "高龄",
_ => "超出范围",
};
println!("年龄 {} 属于 {} 阶段", age, category);
}
fn demonstrate_match_destructuring() {
println!("\n解构匹配:");
// 解构结构体
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
let points = vec![
Point { x: 0, y: 0 },
Point { x: 1, y: 5 },
Point { x: 10, y: -3 },
Point { x: -1, y: -1 },
];
for point in points {
match point {
Point { x: 0, y: 0 } => println!("原点"),
Point { x: 0, y } => println!("在Y轴上,y = {}", y),
Point { x, y: 0 } => println!("在X轴上,x = {}", x),
Point { x, y } if x == y => println!("对角线上的点 ({}, {})", x, y),
Point { x, y } if x > 0 && y > 0 => println!("第一象限的点 ({}, {})", x, y),
Point { x, y } => println!("其他位置的点 ({}, {})", x, y),
}
}
// 解构元组
let tuples = vec![
(1, 2, 3),
(4, 5, 6),
(7, 8, 9),
(0, 0, 0),
];
for tuple in tuples {
match tuple {
(0, 0, 0) => println!("全零元组"),
(x, y, z) if x == y && y == z => println!("所有元素相等: {}", x),
(x, y, z) if x + y + z == 15 => println!("元素和为15: ({}, {}, {})", x, y, z),
(x, ..) if x > 5 => println!("第一个元素大于5: {}", x),
(.., z) if z < 5 => println!("最后一个元素小于5: {}", z),
(x, y, z) => println!("普通元组: ({}, {}, {})", x, y, z),
}
}
// 解构数组
let arrays = vec![
[1, 2, 3],
[4, 5, 6],
[1, 1, 1],
[0, 0, 0],
];
for array in arrays {
match array {
[0, 0, 0] => println!("全零数组"),
[x, y, z] if x == y && y == z => println!("所有元素相等: {}", x),
[1, x, y] => println!("以1开头: [1, {}, {}]", x, y),
[x, y, 6] => println!("以6结尾: [{}, {}, 6]", x, y),
[x, y, z] => println!("普通数组: [{}, {}, {}]", x, y, z),
}
}
}
rustc advanced_match.rs && ./advanced_match
6.2 循环结构
6.2.1 基本循环
fn main() {
println!("🔄 循环结构示例");
println!("===============");
demonstrate_loop();
demonstrate_while();
demonstrate_for();
demonstrate_nested_loops();
}
fn demonstrate_loop() {
println!("\nloop循环:");
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
if counter % 2 == 0 {
println!("偶数计数: {}", counter);
}
};
println!("loop返回值: {}", result);
// 带标签的循环
let mut count = 0;
'counting_up: loop {
println!("count = {}", count);
let mut remaining = 10;
loop {
println!("remaining = {}", remaining);
if remaining == 9 {
break;
}
if count == 2 {
break 'counting_up;
}
remaining -= 1;
}
count += 1;
}
println!("结束计数 = {}", count);
}
fn demonstrate_while() {
println!("\nwhile循环:");
let mut number = 3;
while number != 0 {
println!("{}!", number);
number -= 1;
}
println!("发射!!!");
// while let循环
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);
println!("\n使用while let弹出栈元素:");
while let Some(top) = stack.pop() {
println!("弹出: {}", top);
}
// 条件复杂的while循环
let mut x = 1;
let mut y = 1;
println!("\n斐波那契数列(前10项):");
let mut count = 0;
while count < 10 {
println!("第{}项: {}", count + 1, x);
let temp = x + y;
x = y;
y = temp;
count += 1;
}
}
fn demonstrate_for() {
println!("\nfor循环:");
// 遍历数组
let a = [10, 20, 30, 40, 50];
for element in a {
println!("值是: {}", element);
}
// 使用范围
println!("\n使用范围:");
for number in 1..4 {
println!("{}!", number);
}
// 包含结束值的范围
println!("\n包含结束值的范围:");
for number in 1..=5 {
println!("数字: {}", number);
}
// 反向遍历
println!("\n反向遍历:");
for number in (1..4).rev() {
println!("{}!", number);
}
// 带索引的遍历
let names = vec!["Alice", "Bob", "Charlie", "David"];
println!("\n带索引的遍历:");
for (index, name) in names.iter().enumerate() {
println!("第{}个名字是: {}", index + 1, name);
}
// 遍历HashMap
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert("Blue", 10);
scores.insert("Yellow", 50);
scores.insert("Red", 25);
println!("\n遍历HashMap:");
for (key, value) in &scores {
println!("{}: {}", key, value);
}
// 步长遍历
println!("\n步长遍历(每隔2个):");
for i in (0..10).step_by(2) {
println!("步长遍历: {}", i);
}
}
fn demonstrate_nested_loops() {
println!("\n嵌套循环:");
// 乘法表
println!("九九乘法表:");
for i in 1..=9 {
for j in 1..=i {
print!("{} × {} = {:2} ", j, i, i * j);
}
println!();
}
// 矩阵遍历
let matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
println!("\n矩阵遍历:");
for (row_index, row) in matrix.iter().enumerate() {
for (col_index, &value) in row.iter().enumerate() {
println!("matrix[{}][{}] = {}", row_index, col_index, value);
}
}
// 带标签的嵌套循环
println!("\n查找第一个大于20的乘积:");
'outer: for i in 1..=10 {
for j in 1..=10 {
let product = i * j;
if product > 20 {
println!("找到: {} × {} = {}", i, j, product);
break 'outer;
}
}
}
}
rustc loops_basics.rs && ./loops_basics
6.2.2 循环控制
fn main() {
println!("🎮 循环控制示例");
println!("===============");
demonstrate_break_continue();
demonstrate_loop_labels();
demonstrate_loop_patterns();
}
fn demonstrate_break_continue() {
println!("\nbreak和continue:");
// continue示例
println!("跳过偶数:");
for i in 1..=10 {
if i % 2 == 0 {
continue;
}
println!("奇数: {}", i);
}
// break示例
println!("\n找到第一个大于50的平方数:");
for i in 1..20 {
let square = i * i;
if square > 50 {
println!("{}的平方是{}, 大于50", i, square);
break;
}
println!("{}的平方是{}", i, square);
}
// 复杂的continue逻辑
println!("\n处理数字(跳过特定条件):");
for i in 1..=20 {
// 跳过能被3整除但不能被9整除的数
if i % 3 == 0 && i % 9 != 0 {
continue;
}
// 跳过个位数是7的数
if i % 10 == 7 {
continue;
}
println!("处理数字: {}", i);
}
}
fn demonstrate_loop_labels() {
println!("\n循环标签:");
// 多层循环的标签控制
'search: for x in 1..=5 {
'inner: for y in 1..=5 {
println!("检查 ({}, {})", x, y);
if x == 3 && y == 3 {
println!("找到目标点 (3, 3)!");
break 'search;
}
if y == 2 {
println!("跳过当前行的剩余部分");
continue 'search;
}
}
}
// 复杂的标签使用
println!("\n复杂标签示例:");
let mut found = false;
'outer: for i in 1..=3 {
'middle: for j in 1..=3 {
'inner: for k in 1..=3 {
println!("检查 ({}, {}, {})", i, j, k);
if i + j + k == 6 {
println!("找到和为6的组合: ({}, {}, {})", i, j, k);
found = true;
break 'outer;
}
if k == 2 {
continue 'middle;
}
}
}
}
if found {
println!("搜索完成,找到结果");
} else {
println!("搜索完成,未找到结果");
}
}
fn demonstrate_loop_patterns() {
println!("\n循环模式:");
// 无限循环模式
let mut attempts = 0;
let target = 42;
loop {
attempts += 1;
let guess = attempts * 7; // 模拟某种计算
println!("尝试 {}: 猜测值 {}", attempts, guess);
if guess == target {
println!("找到目标值!");
break;
}
if attempts >= 10 {
println!("达到最大尝试次数");
break;
}
}
// 条件循环模式
println!("\n处理队列:");
let mut queue = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
while !queue.is_empty() {
if let Some(item) = queue.pop() {
println!("处理项目: {}", item);
// 某些条件下重新加入队列
if item % 3 == 0 && item > 3 {
queue.insert(0, item - 1);
println!("重新加入: {}", item - 1);
}
}
// 防止无限循环
if queue.len() > 15 {
println!("队列过长,停止处理");
break;
}
}
// 迭代器模式
println!("\n迭代器模式:");
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 链式操作
let result: Vec<i32> = numbers
.iter()
.filter(|&&x| x % 2 == 0) // 过滤偶数
.map(|&x| x * x) // 平方
.filter(|&x| x > 10) // 过滤大于10的
.collect();
println!("处理结果: {:?}", result);
// 早期退出模式
println!("\n早期退出模式:");
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for (index, &value) in data.iter().enumerate() {
println!("处理索引 {}, 值 {}", index, value);
// 多个退出条件
if value > 7 {
println!("值过大,退出");
break;
}
if index > 5 {
println!("索引过大,退出");
break;
}
// 跳过某些值
if value % 3 == 0 {
println!("跳过能被3整除的值");
continue;
}
println!("成功处理值: {}", value);
}
}
rustc loop_control.rs && ./loop_control
6.3 迭代器
6.3.1 迭代器基础
fn main() {
println!("🚀 迭代器基础");
println!("============");
demonstrate_iterator_creation();
demonstrate_iterator_adaptors();
demonstrate_consuming_adaptors();
demonstrate_iterator_performance();
}
fn demonstrate_iterator_creation() {
println!("\n创建迭代器:");
// 从集合创建迭代器
let vec = vec![1, 2, 3, 4, 5];
// iter() - 借用引用
println!("使用iter()(借用):");
for item in vec.iter() {
println!(" {}", item);
}
// into_iter() - 获取所有权
let vec2 = vec![1, 2, 3, 4, 5];
println!("\n使用into_iter()(所有权):");
for item in vec2.into_iter() {
println!(" {}", item);
}
// vec2在这里不能再使用
// iter_mut() - 可变借用
let mut vec3 = vec![1, 2, 3, 4, 5];
println!("\n使用iter_mut()(可变借用):");
for item in vec3.iter_mut() {
*item *= 2;
println!(" {}", item);
}
println!("修改后的vec3: {:?}", vec3);
// 范围迭代器
println!("\n范围迭代器:");
for i in 0..5 {
println!(" 范围值: {}", i);
}
// 字符串迭代器
let text = "Hello";
println!("\n字符迭代器:");
for ch in text.chars() {
println!(" 字符: {}", ch);
}
// 字节迭代器
println!("\n字节迭代器:");
for byte in text.bytes() {
println!(" 字节: {}", byte);
}
}
fn demonstrate_iterator_adaptors() {
println!("\n迭代器适配器:");
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// map - 转换每个元素
let squares: Vec<i32> = numbers
.iter()
.map(|x| x * x)
.collect();
println!("平方: {:?}", squares);
// filter - 过滤元素
let evens: Vec<&i32> = numbers
.iter()
.filter(|&&x| x % 2 == 0)
.collect();
println!("偶数: {:?}", evens);
// enumerate - 添加索引
println!("\n带索引的迭代:");
for (index, value) in numbers.iter().enumerate() {
println!(" 索引 {}: 值 {}", index, value);
}
// zip - 组合两个迭代器
let names = vec!["Alice", "Bob", "Charlie"];
let ages = vec![25, 30, 35];
println!("\n组合迭代器:");
for (name, age) in names.iter().zip(ages.iter()) {
println!(" {} 年龄 {}", name, age);
}
// take - 取前n个元素
let first_five: Vec<&i32> = numbers
.iter()
.take(5)
.collect();
println!("\n前5个元素: {:?}", first_five);
// skip - 跳过前n个元素
let skip_five: Vec<&i32> = numbers
.iter()
.skip(5)
.collect();
println!("跳过前5个元素: {:?}", skip_five);
// chain - 连接迭代器
let vec1 = vec![1, 2, 3];
let vec2 = vec![4, 5, 6];
let chained: Vec<&i32> = vec1
.iter()
.chain(vec2.iter())
.collect();
println!("连接迭代器: {:?}", chained);
// 复杂的链式操作
let result: Vec<i32> = numbers
.iter()
.filter(|&&x| x > 3) // 过滤大于3的
.map(|x| x * 2) // 乘以2
.filter(|&&x| x < 20) // 过滤小于20的
.map(|x| x + 1) // 加1
.collect();
println!("\n复杂链式操作结果: {:?}", result);
}
fn demonstrate_consuming_adaptors() {
println!("\n消费适配器:");
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// collect - 收集到集合
let doubled: Vec<i32> = numbers
.iter()
.map(|x| x * 2)
.collect();
println!("收集结果: {:?}", doubled);
// reduce/fold - 累积操作
let sum = numbers
.iter()
.fold(0, |acc, x| acc + x);
println!("求和: {}", sum);
let product = numbers
.iter()
.fold(1, |acc, x| acc * x);
println!("求积: {}", product);
// find - 查找第一个匹配的元素
let found = numbers
.iter()
.find(|&&x| x > 5);
match found {
Some(value) => println!("找到第一个大于5的数: {}", value),
None => println!("没有找到大于5的数"),
}
// any - 检查是否有任何元素满足条件
let has_even = numbers
.iter()
.any(|&&x| x % 2 == 0);
println!("是否有偶数: {}", has_even);
// all - 检查是否所有元素都满足条件
let all_positive = numbers
.iter()
.all(|&&x| x > 0);
println!("是否都是正数: {}", all_positive);
// count - 计数
let even_count = numbers
.iter()
.filter(|&&x| x % 2 == 0)
.count();
println!("偶数个数: {}", even_count);
// max/min - 最大值/最小值
let max_value = numbers.iter().max();
let min_value = numbers.iter().min();
println!("最大值: {:?}, 最小值: {:?}", max_value, min_value);
// partition - 分割
let (evens, odds): (Vec<&i32>, Vec<&i32>) = numbers
.iter()
.partition(|&&x| x % 2 == 0);
println!("偶数: {:?}, 奇数: {:?}", evens, odds);
}
fn demonstrate_iterator_performance() {
println!("\n迭代器性能:");
let large_vec: Vec<i32> = (0..1_000_000).collect();
// 使用迭代器(零成本抽象)
let start = std::time::Instant::now();
let sum_iter: i32 = large_vec
.iter()
.filter(|&&x| x % 2 == 0)
.map(|x| x * x)
.sum();
let duration_iter = start.elapsed();
// 使用传统循环
let start = std::time::Instant::now();
let mut sum_loop = 0;
for &x in &large_vec {
if x % 2 == 0 {
sum_loop += x * x;
}
}
let duration_loop = start.elapsed();
println!("迭代器结果: {}, 耗时: {:?}", sum_iter, duration_iter);
println!("循环结果: {}, 耗时: {:?}", sum_loop, duration_loop);
println!("结果相等: {}", sum_iter == sum_loop);
// 惰性求值演示
println!("\n惰性求值演示:");
let lazy_iter = (0..10)
.map(|x| {
println!("处理: {}", x);
x * x
})
.filter(|&x| x > 10);
println!("创建了惰性迭代器,但还没有执行");
let result: Vec<i32> = lazy_iter.take(3).collect();
println!("收集前3个结果: {:?}", result);
}
rustc iterators_basics.rs && ./iterators_basics
6.3.2 自定义迭代器
fn main() {
println!("🔧 自定义迭代器");
println!("==============");
demonstrate_counter();
demonstrate_fibonacci();
demonstrate_range_iterator();
demonstrate_tree_iterator();
}
// 简单计数器迭代器
struct Counter {
current: usize,
max: usize,
}
impl Counter {
fn new(max: usize) -> Counter {
Counter { current: 0, max }
}
}
impl Iterator for Counter {
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
if self.current < self.max {
let current = self.current;
self.current += 1;
Some(current)
} else {
None
}
}
}
fn demonstrate_counter() {
println!("\n计数器迭代器:");
let counter = Counter::new(5);
for num in counter {
println!("计数: {}", num);
}
// 使用迭代器方法
let counter2 = Counter::new(10);
let sum: usize = counter2
.filter(|&x| x % 2 == 0)
.map(|x| x * x)
.sum();
println!("偶数平方和: {}", sum);
}
// 斐波那契迭代器
struct Fibonacci {
current: u64,
next: u64,
count: usize,
max_count: usize,
}
impl Fibonacci {
fn new(max_count: usize) -> Fibonacci {
Fibonacci {
current: 0,
next: 1,
count: 0,
max_count,
}
}
}
impl Iterator for Fibonacci {
type Item = u64;
fn next(&mut self) -> Option<Self::Item> {
if self.count >= self.max_count {
return None;
}
let current = self.current;
self.current = self.next;
self.next = current + self.next;
self.count += 1;
Some(current)
}
}
fn demonstrate_fibonacci() {
println!("\n斐波那契迭代器:");
let fib = Fibonacci::new(10);
for (i, num) in fib.enumerate() {
println!("斐波那契第{}项: {}", i + 1, num);
}
// 找到第一个大于100的斐波那契数
let fib2 = Fibonacci::new(20);
if let Some(large_fib) = fib2.find(|&x| x > 100) {
println!("第一个大于100的斐波那契数: {}", large_fib);
}
}
// 自定义范围迭代器
struct StepRange {
current: i32,
end: i32,
step: i32,
}
impl StepRange {
fn new(start: i32, end: i32, step: i32) -> StepRange {
StepRange {
current: start,
end,
step,
}
}
}
impl Iterator for StepRange {
type Item = i32;
fn next(&mut self) -> Option<Self::Item> {
if (self.step > 0 && self.current < self.end) ||
(self.step < 0 && self.current > self.end) {
let current = self.current;
self.current += self.step;
Some(current)
} else {
None
}
}
}
fn demonstrate_range_iterator() {
println!("\n步长范围迭代器:");
// 正向步长
println!("正向步长2:");
let range1 = StepRange::new(0, 10, 2);
for num in range1 {
println!(" {}", num);
}
// 反向步长
println!("\n反向步长3:");
let range2 = StepRange::new(20, 5, -3);
for num in range2 {
println!(" {}", num);
}
// 使用collect收集
let range3 = StepRange::new(1, 20, 4);
let collected: Vec<i32> = range3.collect();
println!("\n收集的步长范围: {:?}", collected);
}
// 二叉树迭代器
#[derive(Debug)]
struct TreeNode {
value: i32,
left: Option<Box<TreeNode>>,
right: Option<Box<TreeNode>>,
}
impl TreeNode {
fn new(value: i32) -> Self {
TreeNode {
value,
left: None,
right: None,
}
}
fn with_children(value: i32, left: Option<Box<TreeNode>>, right: Option<Box<TreeNode>>) -> Self {
TreeNode { value, left, right }
}
}
struct TreeIterator {
stack: Vec<Box<TreeNode>>,
}
impl TreeIterator {
fn new(root: Option<Box<TreeNode>>) -> Self {
let mut stack = Vec::new();
if let Some(node) = root {
stack.push(node);
}
TreeIterator { stack }
}
}
impl Iterator for TreeIterator {
type Item = i32;
fn next(&mut self) -> Option<Self::Item> {
if let Some(node) = self.stack.pop() {
// 先推入右子树,再推入左子树(因为栈是后进先出)
if let Some(right) = node.right {
self.stack.push(right);
}
if let Some(left) = node.left {
self.stack.push(left);
}
Some(node.value)
} else {
None
}
}
}
fn demonstrate_tree_iterator() {
println!("\n二叉树迭代器:");
// 构建一个简单的二叉树
// 1
// / \
// 2 3
// / \
// 4 5
let tree = Some(Box::new(TreeNode::with_children(
1,
Some(Box::new(TreeNode::with_children(
2,
Some(Box::new(TreeNode::new(4))),
Some(Box::new(TreeNode::new(5))),
))),
Some(Box::new(TreeNode::new(3))),
)));
let tree_iter = TreeIterator::new(tree);
println!("前序遍历:");
for value in tree_iter {
println!(" 节点值: {}", value);
}
// 创建另一个树进行更复杂的操作
let tree2 = Some(Box::new(TreeNode::with_children(
10,
Some(Box::new(TreeNode::with_children(
5,
Some(Box::new(TreeNode::new(3))),
Some(Box::new(TreeNode::new(7))),
))),
Some(Box::new(TreeNode::with_children(
15,
Some(Box::new(TreeNode::new(12))),
Some(Box::new(TreeNode::new(18))),
))),
)));
let tree_iter2 = TreeIterator::new(tree2);
// 使用迭代器方法
let sum: i32 = tree_iter2.sum();
println!("\n树中所有节点值的和: {}", sum);
// 演示迭代器组合
demonstrate_iterator_combinations();
}
fn demonstrate_iterator_combinations() {
println!("\n迭代器组合:");
// 组合多个自定义迭代器
let counter = Counter::new(5);
let fib = Fibonacci::new(5);
// 使用zip组合
let combined: Vec<(usize, u64)> = counter.zip(fib).collect();
println!("计数器和斐波那契组合: {:?}", combined);
// 链式组合
let range1 = StepRange::new(1, 6, 1);
let range2 = StepRange::new(10, 16, 1);
let chained: Vec<i32> = range1.chain(range2).collect();
println!("链式组合范围: {:?}", chained);
// 复杂的迭代器操作
let fib_large = Fibonacci::new(15);
let result: Vec<u64> = fib_large
.filter(|&x| x % 2 == 0) // 偶数斐波那契数
.map(|x| x * 2) // 乘以2
.take(5) // 取前5个
.collect();
println!("处理后的斐波那契数: {:?}", result);
}
rustc custom_iterators.rs && ./custom_iterators
6.4 闭包
6.4.1 闭包基础
fn main() {
println!("📦 闭包基础");
println!("===========");
demonstrate_closure_syntax();
demonstrate_closure_capture();
demonstrate_closure_traits();
demonstrate_closure_as_parameters();
}
fn demonstrate_closure_syntax() {
println!("\n闭包语法:");
// 基本闭包语法
let add_one = |x| x + 1;
println!("5 + 1 = {}", add_one(5));
// 显式类型注解
let add_two = |x: i32| -> i32 { x + 2 };
println!("5 + 2 = {}", add_two(5));
// 多参数闭包
let multiply = |x, y| x * y;
println!("3 * 4 = {}", multiply(3, 4));
// 无参数闭包
let get_random = || 42;
println!("随机数: {}", get_random());
// 复杂闭包体
let complex_operation = |x: i32| {
let doubled = x * 2;
let squared = doubled * doubled;
squared + 1
};
println!("复杂操作结果: {}", complex_operation(3));
// 闭包类型推断
let numbers = vec![1, 2, 3, 4, 5];
// 编译器可以推断闭包的类型
let doubled: Vec<i32> = numbers
.iter()
.map(|x| x * 2)
.collect();
println!("翻倍结果: {:?}", doubled);
// 不同的闭包语法形式
let add_one_v1 = |x: u32| -> u32 { x + 1 };
let add_one_v2 = |x| { x + 1 };
let add_one_v3 = |x| x + 1 ;
println!("不同语法形式: {}, {}, {}",
add_one_v1(1), add_one_v2(1), add_one_v3(1));
}
fn demonstrate_closure_capture() {
println!("\n闭包捕获:");
// 捕获不可变引用
let x = 4;
let equal_to_x = |z| z == x;
let y = 4;
println!("y等于x吗? {}", equal_to_x(y));
// 捕获可变引用
let mut count = 0;
let mut increment = || {
count += 1;
println!("计数: {}", count);
};
increment();
increment();
increment();
// 获取所有权
let name = String::from("Alice");
let greet = move || {
println!("Hello, {}!", name);
};
greet();
// name在这里不能再使用,因为被move了
// 演示不同的捕获方式
demonstrate_capture_modes();
}
fn demonstrate_capture_modes() {
println!("\n捕获模式:");
// FnOnce - 获取所有权
let consume_with_relish = |food: String| {
println!("美味地吃掉: {}", food);
};
let food = String::from("苹果");
consume_with_relish(food);
// food不能再使用
// Fn - 不可变借用
let x = vec![1, 2, 3];
let print_vec = || {
println!("向量: {:?}", x);
};
print_vec();
print_vec(); // 可以多次调用
println!("x仍然可用: {:?}", x);
// FnMut - 可变借用
let mut y = vec![1, 2, 3];
let mut modify_vec = || {
y.push(4);
println!("修改后的向量: {:?}", y);
};
modify_vec();
modify_vec();
// move关键字强制获取所有权
let z = vec![1, 2, 3];
let take_ownership = move || {
println!("拥有的向量: {:?}", z);
};
take_ownership();
// z不能再使用
// 在线程中使用move
let data = vec![1, 2, 3, 4, 5];
let handle = std::thread::spawn(move || {
println!("线程中的数据: {:?}", data);
});
handle.join().unwrap();
}
fn demonstrate_closure_traits() {
println!("\n闭包特征:");
// 演示不同特征的闭包
let fn_closure = || println!("这是一个Fn闭包");
let mut count = 0;
let fn_mut_closure = || {
count += 1;
println!("这是一个FnMut闭包,计数: {}", count);
};
let data = String::from("数据");
let fn_once_closure = move || {
println!("这是一个FnOnce闭包,数据: {}", data);
};
// 调用不同类型的闭包
call_fn(fn_closure);
call_fn_mut(fn_mut_closure);
call_fn_once(fn_once_closure);
// 演示闭包作为返回值
let multiplier = create_multiplier(3);
println!("乘法器结果: {}", multiplier(10));
let adder = create_adder(5);
println!("加法器结果: {}", adder(7));
}
fn call_fn<F>(f: F)
where
F: Fn(),
{
f();
f(); // Fn可以多次调用
}
fn call_fn_mut<F>(mut f: F)
where
F: FnMut(),
{
f();
f(); // FnMut可以多次调用
}
fn call_fn_once<F>(f: F)
where
F: FnOnce(),
{
f(); // FnOnce只能调用一次
}
// 返回闭包
fn create_multiplier(factor: i32) -> impl Fn(i32) -> i32 {
move |x| x * factor
}
fn create_adder(addend: i32) -> Box<dyn Fn(i32) -> i32> {
Box::new(move |x| x + addend)
}
fn demonstrate_closure_as_parameters() {
println!("\n闭包作为参数:");
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 使用闭包进行过滤和映射
let result = process_numbers(&numbers, |x| x % 2 == 0, |x| x * x);
println!("偶数平方: {:?}", result);
let result2 = process_numbers(&numbers, |x| x > 5, |x| x + 10);
println!("大于5的数加10: {:?}", result2);
// 使用闭包进行排序
let mut words = vec!["banana", "apple", "cherry", "date"];
sort_by(&mut words, |a, b| a.len().cmp(&b.len()));
println!("按长度排序: {:?}", words);
let mut numbers2 = vec![3, 1, 4, 1, 5, 9, 2, 6];
sort_by(&mut numbers2, |a, b| b.cmp(a)); // 降序
println!("降序排序: {:?}", numbers2);
// 高阶函数示例
let add_ten = create_operation(10, |a, b| a + b);
let multiply_by_three = create_operation(3, |a, b| a * b);
println!("5 + 10 = {}", add_ten(5));
println!("5 * 3 = {}", multiply_by_three(5));
}
fn process_numbers<F, G>(numbers: &[i32], filter: F, map: G) -> Vec<i32>
where
F: Fn(&i32) -> bool,
G: Fn(&i32) -> i32,
{
numbers
.iter()
.filter(|&x| filter(x))
.map(|x| map(x))
.collect()
}
fn sort_by<T, F>(slice: &mut [T], compare: F)
where
F: Fn(&T, &T) -> std::cmp::Ordering,
{
slice.sort_by(compare);
}
fn create_operation<F>(value: i32, op: F) -> impl Fn(i32) -> i32
where
F: Fn(i32, i32) -> i32,
{
move |x| op(x, value)
}
rustc closures_basics.rs && ./closures_basics
6.4.2 高级闭包应用
use std::collections::HashMap;
use std::thread;
use std::time::Duration;
fn main() {
println!("🚀 高级闭包应用");
println!("===============");
demonstrate_memoization();
demonstrate_lazy_evaluation();
demonstrate_callback_patterns();
demonstrate_functional_programming();
}
// 记忆化(缓存)模式
struct Memoizer<F, K, V>
where
F: Fn(&K) -> V,
K: std::hash::Hash + Eq + Clone,
V: Clone,
{
calculation: F,
cache: std::cell::RefCell<HashMap<K, V>>,
}
impl<F, K, V> Memoizer<F, K, V>
where
F: Fn(&K) -> V,
K: std::hash::Hash + Eq + Clone,
V: Clone,
{
fn new(calculation: F) -> Self {
Memoizer {
calculation,
cache: std::cell::RefCell::new(HashMap::new()),
}
}
fn call(&self, key: K) -> V {
let mut cache = self.cache.borrow_mut();
if let Some(cached_value) = cache.get(&key) {
println!("缓存命中: {:?}", key);
cached_value.clone()
} else {
println!("计算新值: {:?}", key);
let value = (self.calculation)(&key);
cache.insert(key, value.clone());
value
}
}
}
fn demonstrate_memoization() {
println!("\n记忆化模式:");
// 昂贵的斐波那契计算
let fib_calculator = Memoizer::new(|&n: &u32| -> u64 {
if n <= 1 {
n as u64
} else {
// 模拟昂贵的计算
thread::sleep(Duration::from_millis(100));
fibonacci_recursive(n)
}
});
println!("计算斐波那契数列:");
for i in [10, 5, 10, 8, 5, 12] {
let start = std::time::Instant::now();
let result = fib_calculator.call(i);
let duration = start.elapsed();
println!("fib({}) = {}, 耗时: {:?}", i, result, duration);
}
// 字符串处理的记忆化
let string_processor = Memoizer::new(|text: &String| -> String {
println!("处理字符串: {}", text);
thread::sleep(Duration::from_millis(50));
text.to_uppercase().chars().rev().collect()
});
let texts = vec![
"hello".to_string(),
"world".to_string(),
"hello".to_string(), // 应该使用缓存
"rust".to_string(),
"world".to_string(), // 应该使用缓存
];
println!("\n字符串处理:");
for text in texts {
let result = string_processor.call(text.clone());
println!("{} -> {}", text, result);
}
}
fn fibonacci_recursive(n: u32) -> u64 {
if n <= 1 {
n as u64
} else {
fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
}
}
// 惰性求值
struct LazyValue<F, T>
where
F: FnOnce() -> T,
{
calculation: Option<F>,
value: Option<T>,
}
impl<F, T> LazyValue<F, T>
where
F: FnOnce() -> T,
{
fn new(calculation: F) -> Self {
LazyValue {
calculation: Some(calculation),
value: None,
}
}
fn get(&mut self) -> &T {
if self.value.is_none() {
let calculation = self.calculation.take().unwrap();
self.value = Some(calculation());
}
self.value.as_ref().unwrap()
}
}
fn demonstrate_lazy_evaluation() {
println!("\n惰性求值:");
let mut expensive_calculation = LazyValue::new(|| {
println!("执行昂贵的计算...");
thread::sleep(Duration::from_millis(100));
42 * 42
});
println!("创建了惰性值,但还没有计算");
// 第一次访问时才计算
println!("第一次访问: {}", expensive_calculation.get());
// 后续访问使用缓存的值
println!("第二次访问: {}", expensive_calculation.get());
println!("第三次访问: {}", expensive_calculation.get());
// 惰性列表处理
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let lazy_operations = numbers
.iter()
.map(|&x| {
LazyValue::new(move || {
println!("处理数字: {}", x);
x * x * x // 立方
})
})
.collect::<Vec<_>>();
println!("\n创建了惰性操作列表");
// 只计算前3个
println!("只计算前3个:");
for (i, mut lazy_op) in lazy_operations.into_iter().take(3).enumerate() {
println!("结果 {}: {}", i, lazy_op.get());
}
}
// 回调模式
struct EventEmitter<T> {
listeners: Vec<Box<dyn Fn(&T)>>,
}
impl<T> EventEmitter<T> {
fn new() -> Self {
EventEmitter {
listeners: Vec::new(),
}
}
fn on<F>(&mut self, listener: F)
where
F: Fn(&T) + 'static,
{
self.listeners.push(Box::new(listener));
}
fn emit(&self, event: &T) {
for listener in &self.listeners {
listener(event);
}
}
}
#[derive(Debug, Clone)]
struct UserEvent {
user_id: u32,
action: String,
timestamp: u64,
}
fn demonstrate_callback_patterns() {
println!("\n回调模式:");
let mut event_emitter = EventEmitter::new();
// 注册多个事件监听器
event_emitter.on(|event: &UserEvent| {
println!("日志记录: 用户 {} 执行了 {}", event.user_id, event.action);
});
event_emitter.on(|event: &UserEvent| {
if event.action == "login" {
println!("安全检查: 用户 {} 登录", event.user_id);
}
});
event_emitter.on(|event: &UserEvent| {
println!("统计: 记录用户 {} 的活动", event.user_id);
});
// 触发事件
let events = vec![
UserEvent {
user_id: 1,
action: "login".to_string(),
timestamp: 1234567890,
},
UserEvent {
user_id: 1,
action: "view_page".to_string(),
timestamp: 1234567891,
},
UserEvent {
user_id: 2,
action: "login".to_string(),
timestamp: 1234567892,
},
];
for event in &events {
println!("\n触发事件: {:?}", event);
event_emitter.emit(event);
}
// 链式回调
demonstrate_chained_callbacks();
}
fn demonstrate_chained_callbacks() {
println!("\n链式回调:");
// 模拟异步操作的链式调用
let process_data = |data: i32, callback: Box<dyn Fn(i32)>| {
println!("处理数据: {}", data);
let result = data * 2;
callback(result);
};
let validate_data = |data: i32, callback: Box<dyn Fn(i32)>| {
println!("验证数据: {}", data);
if data > 0 {
callback(data);
} else {
println!("数据验证失败");
}
};
let save_data = |data: i32| {
println!("保存数据: {}", data);
};
// 链式调用
validate_data(5, Box::new(|validated_data| {
process_data(validated_data, Box::new(|processed_data| {
save_data(processed_data);
}));
}));
}
fn demonstrate_functional_programming() {
println!("\n函数式编程模式:");
// 函数组合
let add_one = |x: i32| x + 1;
let multiply_by_two = |x: i32| x * 2;
let square = |x: i32| x * x;
// 组合函数
let composed = compose(compose(add_one, multiply_by_two), square);
println!("组合函数结果: {}", composed(3)); // ((3 + 1) * 2)^2 = 64
// 柯里化
let add = |x: i32| move |y: i32| x + y;
let add_five = add(5);
println!("柯里化结果: {}", add_five(10)); // 15
// 高阶函数应用
let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 使用闭包进行复杂的数据处理
let result = numbers
.iter()
.filter(|&&x| x % 2 == 0) // 过滤偶数
.map(|&x| x * x) // 平方
.filter(|&x| x > 10) // 过滤大于10的
.fold(0, |acc, x| acc + x); // 求和
println!("函数式处理结果: {}", result);
// 使用闭包实现策略模式
demonstrate_strategy_pattern();
}
fn compose<F, G, A, B, C>(f: F, g: G) -> impl Fn(A) -> C
where
F: Fn(A) -> B,
G: Fn(B) -> C,
{
move |x| g(f(x))
}
fn demonstrate_strategy_pattern() {
println!("\n策略模式:");
// 不同的排序策略
let mut numbers = vec![64, 34, 25, 12, 22, 11, 90];
// 升序策略
let ascending = |a: &i32, b: &i32| a.cmp(b);
// 降序策略
let descending = |a: &i32, b: &i32| b.cmp(a);
// 按绝对值排序策略
let by_abs = |a: &i32, b: &i32| a.abs().cmp(&b.abs());
println!("原始数组: {:?}", numbers);
// 使用不同策略排序
let mut temp = numbers.clone();
temp.sort_by(ascending);
println!("升序排序: {:?}", temp);
let mut temp = numbers.clone();
temp.sort_by(descending);
println!("降序排序: {:?}", temp);
let mut temp = vec![-5, 3, -1, 4, -2];
temp.sort_by(by_abs);
println!("按绝对值排序: {:?}", temp);
// 计算策略
let calculate = |numbers: &[i32], strategy: Box<dyn Fn(&[i32]) -> i32>| {
strategy(numbers)
};
let sum_strategy = Box::new(|nums: &[i32]| nums.iter().sum());
let product_strategy = Box::new(|nums: &[i32]| nums.iter().product());
let max_strategy = Box::new(|nums: &[i32]| *nums.iter().max().unwrap_or(&0));
let test_numbers = vec![1, 2, 3, 4, 5];
println!("\n计算策略:");
println!("数组: {:?}", test_numbers);
println!("求和: {}", calculate(&test_numbers, sum_strategy));
println!("求积: {}", calculate(&test_numbers, product_strategy));
println!("最大值: {}", calculate(&test_numbers, max_strategy));
}
rustc advanced_closures.rs && ./advanced_closures
6.5 错误处理控制流
6.5.1 Result和Option的控制流
use std::fs::File;
use std::io::{self, Read};
use std::num::ParseIntError;
fn main() {
println!("🛡️ 错误处理控制流");
println!("=================");
demonstrate_option_control_flow();
demonstrate_result_control_flow();
demonstrate_error_propagation();
demonstrate_error_recovery();
}
fn demonstrate_option_control_flow() {
println!("\nOption控制流:");
let numbers = vec!["1", "2", "not_a_number", "4", "5"];
// 使用if let处理Option
for num_str in &numbers {
if let Ok(num) = num_str.parse::<i32>() {
println!("解析成功: {} -> {}", num_str, num);
} else {
println!("解析失败: {}", num_str);
}
}
// 使用match处理Option
let maybe_number = Some(42);
match maybe_number {
Some(n) if n > 40 => println!("大数字: {}", n),
Some(n) => println!("小数字: {}", n),
None => println!("没有数字"),
}
// 使用map和filter处理Option序列
let options = vec![Some(1), None, Some(3), Some(4), None, Some(6)];
let processed: Vec<i32> = options
.iter()
.filter_map(|&opt| opt) // 过滤掉None,提取Some中的值
.map(|x| x * 2) // 处理值
.filter(|&x| x > 4) // 过滤结果
.collect();
println!("处理后的Option序列: {:?}", processed);
// 使用and_then进行链式操作
let result = Some("42")
.and_then(|s| s.parse::<i32>().ok())
.and_then(|n| if n > 0 { Some(n * 2) } else { None })
.and_then(|n| if n < 100 { Some(n) } else { None });
println!("链式Option操作结果: {:?}", result);
// 使用or_else提供备选方案
let primary = None;
let secondary = Some("备选值");
let final_value = primary
.or_else(|| secondary)
.or_else(|| Some("默认值"));
println!("备选方案结果: {:?}", final_value);
}
fn demonstrate_result_control_flow() {
println!("\nResult控制流:");
// 基本Result处理
let division_results = vec![
divide(10, 2),
divide(10, 0),
divide(8, 4),
divide(15, 0),
];
for (i, result) in division_results.iter().enumerate() {
match result {
Ok(value) => println!("除法 {} 成功: {}", i, value),
Err(e) => println!("除法 {} 失败: {}", i, e),
}
}
// 使用map和map_err转换Result
let number_str = "42";
let result = number_str
.parse::<i32>()
.map(|n| n * 2) // 成功时转换值
.map_err(|e| format!("解析错误: {}", e)); // 失败时转换错误
println!("转换后的Result: {:?}", result);
// 使用and_then进行可能失败的链式操作
let chain_result = "100"
.parse::<i32>()
.and_then(|n| divide(n, 2))
.and_then(|n| divide(n, 5))
.and_then(|n| if n > 0 { Ok(n) } else { Err("结果不是正数".to_string()) });
println!("链式Result操作: {:?}", chain_result);
// 使用or_else进行错误恢复
let recovery_result = divide(10, 0)
.or_else(|_| {
println!("第一次尝试失败,尝试备选方案");
divide(10, 2)
})
.or_else(|_| {
println!("第二次尝试失败,使用默认值");
Ok(1)
});
println!("错误恢复结果: {:?}", recovery_result);
}
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
Err("除零错误".to_string())
} else {
Ok(a / b)
}
}
fn demonstrate_error_propagation() {
println!("\n错误传播:");
// 使用?操作符进行错误传播
match read_and_parse_file("numbers.txt") {
Ok(numbers) => println!("成功读取数字: {:?}", numbers),
Err(e) => println!("操作失败: {}", e),
}
// 创建测试文件
std::fs::write("test_numbers.txt", "1\n2\n3\n4\n5").unwrap();
match read_and_parse_file("test_numbers.txt") {
Ok(numbers) => {
println!("成功读取数字: {:?}", numbers);
let sum: i32 = numbers.iter().sum();
println!("数字总和: {}", sum);
}
Err(e) => println!("操作失败: {}", e),
}
// 清理测试文件
let _ = std::fs::remove_file("test_numbers.txt");
// 复杂的错误传播链
match complex_operation("42") {
Ok(result) => println!("复杂操作成功: {}", result),
Err(e) => println!("复杂操作失败: {}", e),
}
match complex_operation("not_a_number") {
Ok(result) => println!("复杂操作成功: {}", result),
Err(e) => println!("复杂操作失败: {}", e),
}
}
#[derive(Debug)]
enum MyError {
Io(io::Error),
Parse(ParseIntError),
Custom(String),
}
impl From<io::Error> for MyError {
fn from(error: io::Error) -> Self {
MyError::Io(error)
}
}
impl From<ParseIntError> for MyError {
fn from(error: ParseIntError) -> Self {
MyError::Parse(error)
}
}
impl std::fmt::Display for MyError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
MyError::Io(e) => write!(f, "IO错误: {}", e),
MyError::Parse(e) => write!(f, "解析错误: {}", e),
MyError::Custom(msg) => write!(f, "自定义错误: {}", msg),
}
}
}
fn read_and_parse_file(filename: &str) -> Result<Vec<i32>, MyError> {
let mut file = File::open(filename)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
let numbers: Result<Vec<i32>, _> = contents
.lines()
.map(|line| line.trim().parse::<i32>())
.collect();
Ok(numbers?)
}
fn complex_operation(input: &str) -> Result<i32, MyError> {
let number = input.parse::<i32>()?;
if number < 0 {
return Err(MyError::Custom("数字不能为负数".to_string()));
}
let doubled = number * 2;
if doubled > 1000 {
return Err(MyError::Custom("结果太大".to_string()));
}
Ok(doubled)
}
fn demonstrate_error_recovery() {
println!("\n错误恢复策略:");
// 重试机制
let result = retry_operation(3, || {
static mut ATTEMPT: i32 = 0;
unsafe {
ATTEMPT += 1;
if ATTEMPT < 3 {
Err(format!("尝试 {} 失败", ATTEMPT))
} else {
Ok("成功!")
}
}
});
match result {
Ok(value) => println!("重试成功: {}", value),
Err(e) => println!("重试失败: {}", e),
}
// 降级处理
let services = vec!["primary", "secondary", "fallback"];
for service in &services {
match call_service(service) {
Ok(response) => {
println!("服务 {} 响应: {}", service, response);
break;
}
Err(e) => {
println!("服务 {} 失败: {}, 尝试下一个", service, e);
continue;
}
}
}
// 部分成功处理
let inputs = vec!["1", "2", "invalid", "4", "5"];
let (successes, failures): (Vec<_>, Vec<_>) = inputs
.iter()
.map(|&s| s.parse::<i32>())
.partition(Result::is_ok);
let successes: Vec<i32> = successes.into_iter().map(Result::unwrap).collect();
let failures: Vec<_> = failures.into_iter().map(Result::unwrap_err).collect();
println!("\n部分成功处理:");
println!("成功: {:?}", successes);
println!("失败: {} 个", failures.len());
// 累积错误
let results = vec![
Ok(1),
Err("错误1".to_string()),
Ok(2),
Err("错误2".to_string()),
Ok(3),
];
let (values, errors): (Vec<_>, Vec<_>) = results
.into_iter()
.partition(Result::is_ok);
let values: Vec<i32> = values.into_iter().map(Result::unwrap).collect();
let errors: Vec<String> = errors.into_iter().map(Result::unwrap_err).collect();
println!("\n累积结果:");
println!("值: {:?}", values);
println!("错误: {:?}", errors);
}
fn retry_operation<F, T, E>(max_attempts: usize, mut operation: F) -> Result<T, E>
where
F: FnMut() -> Result<T, E>,
{
let mut attempts = 0;
loop {
attempts += 1;
match operation() {
Ok(result) => return Ok(result),
Err(e) => {
if attempts >= max_attempts {
return Err(e);
}
println!("尝试 {} 失败,重试中...", attempts);
}
}
}
}
fn call_service(service: &str) -> Result<String, String> {
match service {
"primary" => Err("主服务不可用".to_string()),
"secondary" => Err("备用服务不可用".to_string()),
"fallback" => Ok("降级服务响应".to_string()),
_ => Err("未知服务".to_string()),
}
}
rustc error_control_flow.rs && ./error_control_flow
6.6 综合示例:状态机
use std::collections::HashMap;
use std::fmt;
fn main() {
println!("🤖 状态机示例");
println!("============");
demonstrate_traffic_light();
demonstrate_order_processing();
demonstrate_game_state();
}
// 交通灯状态机
#[derive(Debug, Clone, PartialEq)]
enum TrafficLightState {
Red,
Yellow,
Green,
}
impl TrafficLightState {
fn next(&self) -> Self {
match self {
TrafficLightState::Red => TrafficLightState::Green,
TrafficLightState::Green => TrafficLightState::Yellow,
TrafficLightState::Yellow => TrafficLightState::Red,
}
}
fn duration(&self) -> u32 {
match self {
TrafficLightState::Red => 30,
TrafficLightState::Yellow => 5,
TrafficLightState::Green => 25,
}
}
}
impl fmt::Display for TrafficLightState {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
TrafficLightState::Red => write!(f, "🔴 红灯"),
TrafficLightState::Yellow => write!(f, "🟡 黄灯"),
TrafficLightState::Green => write!(f, "🟢 绿灯"),
}
}
}
struct TrafficLight {
state: TrafficLightState,
remaining_time: u32,
}
impl TrafficLight {
fn new() -> Self {
TrafficLight {
state: TrafficLightState::Red,
remaining_time: TrafficLightState::Red.duration(),
}
}
fn tick(&mut self) {
if self.remaining_time > 0 {
self.remaining_time -= 1;
} else {
self.state = self.state.next();
self.remaining_time = self.state.duration();
}
}
fn status(&self) -> String {
format!("{} (剩余: {}秒)", self.state, self.remaining_time)
}
}
fn demonstrate_traffic_light() {
println!("\n交通灯状态机:");
let mut traffic_light = TrafficLight::new();
// 模拟60秒的运行
for second in 1..=60 {
println!("第{}秒: {}", second, traffic_light.status());
traffic_light.tick();
// 每10秒显示一次分隔线
if second % 10 == 0 {
println!("----------");
}
}
}
// 订单处理状态机
#[derive(Debug, Clone, PartialEq)]
enum OrderState {
Pending,
Confirmed,
Processing,
Shipped,
Delivered,
Cancelled,
}
#[derive(Debug, Clone)]
enum OrderEvent {
Confirm,
StartProcessing,
Ship,
Deliver,
Cancel,
}
#[derive(Debug)]
struct OrderStateMachine {
state: OrderState,
transitions: HashMap<(OrderState, OrderEvent), OrderState>,
}
impl OrderStateMachine {
fn new() -> Self {
let mut transitions = HashMap::new();
// 定义状态转换规则
transitions.insert((OrderState::Pending, OrderEvent::Confirm), OrderState::Confirmed);
transitions.insert((OrderState::Pending, OrderEvent::Cancel), OrderState::Cancelled);
transitions.insert((OrderState::Confirmed, OrderEvent::StartProcessing), OrderState::Processing);
transitions.insert((OrderState::Confirmed, OrderEvent::Cancel), OrderState::Cancelled);
transitions.insert((OrderState::Processing, OrderEvent::Ship), OrderState::Shipped);
transitions.insert((OrderState::Processing, OrderEvent::Cancel), OrderState::Cancelled);
transitions.insert((OrderState::Shipped, OrderEvent::Deliver), OrderState::Delivered);
OrderStateMachine {
state: OrderState::Pending,
transitions,
}
}
fn handle_event(&mut self, event: OrderEvent) -> Result<(), String> {
let key = (self.state.clone(), event.clone());
if let Some(new_state) = self.transitions.get(&key) {
println!("状态转换: {:?} --{:?}--> {:?}", self.state, event, new_state);
self.state = new_state.clone();
Ok(())
} else {
Err(format!("无效的状态转换: {:?} 在状态 {:?}", event, self.state))
}
}
fn current_state(&self) -> &OrderState {
&self.state
}
fn can_handle(&self, event: &OrderEvent) -> bool {
self.transitions.contains_key(&(self.state.clone(), event.clone()))
}
}
fn demonstrate_order_processing() {
println!("\n订单处理状态机:");
let mut order = OrderStateMachine::new();
let events = vec![
OrderEvent::Confirm,
OrderEvent::StartProcessing,
OrderEvent::Ship,
OrderEvent::Deliver,
];
println!("初始状态: {:?}", order.current_state());
for event in events {
match order.handle_event(event.clone()) {
Ok(()) => println!("当前状态: {:?}", order.current_state()),
Err(e) => println!("错误: {}", e),
}
}
// 测试无效转换
println!("\n测试无效转换:");
let invalid_events = vec![
OrderEvent::StartProcessing, // 已经是Delivered状态
OrderEvent::Cancel, // 无法取消已交付的订单
];
for event in invalid_events {
if order.can_handle(&event) {
let _ = order.handle_event(event);
} else {
println!("无法在状态 {:?} 下处理事件 {:?}", order.current_state(), event);
}
}
// 演示取消流程
println!("\n演示取消流程:");
let mut order2 = OrderStateMachine::new();
let _ = order2.handle_event(OrderEvent::Confirm);
let _ = order2.handle_event(OrderEvent::Cancel);
println!("最终状态: {:?}", order2.current_state());
}
// 游戏状态机
#[derive(Debug, Clone, PartialEq)]
enum GameState {
Menu,
Playing,
Paused,
GameOver,
Victory,
}
#[derive(Debug, Clone)]
enum GameEvent {
StartGame,
PauseGame,
ResumeGame,
PlayerDied,
PlayerWon,
RestartGame,
QuitToMenu,
}
struct GameStateMachine {
state: GameState,
score: u32,
lives: u32,
}
impl GameStateMachine {
fn new() -> Self {
GameStateMachine {
state: GameState::Menu,
score: 0,
lives: 3,
}
}
fn handle_event(&mut self, event: GameEvent) -> Result<String, String> {
let old_state = self.state.clone();
match (&self.state, &event) {
(GameState::Menu, GameEvent::StartGame) => {
self.state = GameState::Playing;
self.score = 0;
self.lives = 3;
Ok("游戏开始!".to_string())
}
(GameState::Playing, GameEvent::PauseGame) => {
self.state = GameState::Paused;
Ok("游戏暂停".to_string())
}
(GameState::Paused, GameEvent::ResumeGame) => {
self.state = GameState::Playing;
Ok("游戏继续".to_string())
}
(GameState::Playing, GameEvent::PlayerDied) => {
self.lives -= 1;
if self.lives == 0 {
self.state = GameState::GameOver;
Ok(format!("游戏结束!最终得分: {}", self.score))
} else {
Ok(format!("玩家死亡!剩余生命: {}", self.lives))
}
}
(GameState::Playing, GameEvent::PlayerWon) => {
self.state = GameState::Victory;
Ok(format!("胜利!最终得分: {}", self.score))
}
(GameState::GameOver | GameState::Victory, GameEvent::RestartGame) => {
self.state = GameState::Playing;
self.score = 0;
self.lives = 3;
Ok("重新开始游戏".to_string())
}
(_, GameEvent::QuitToMenu) => {
self.state = GameState::Menu;
Ok("返回主菜单".to_string())
}
_ => Err(format!("无效的事件 {:?} 在状态 {:?}", event, old_state)),
}
}
fn add_score(&mut self, points: u32) {
if self.state == GameState::Playing {
self.score += points;
}
}
fn status(&self) -> String {
match self.state {
GameState::Menu => "主菜单".to_string(),
GameState::Playing => format!("游戏中 - 得分: {}, 生命: {}", self.score, self.lives),
GameState::Paused => format!("暂停中 - 得分: {}, 生命: {}", self.score, self.lives),
GameState::GameOver => format!("游戏结束 - 最终得分: {}", self.score),
GameState::Victory => format!("胜利! - 最终得分: {}", self.score),
}
}
}
fn demonstrate_game_state() {
println!("\n游戏状态机:");
let mut game = GameStateMachine::new();
println!("初始状态: {}", game.status());
// 模拟游戏流程
let game_flow = vec![
(GameEvent::StartGame, "开始游戏"),
(GameEvent::PauseGame, "暂停游戏"),
(GameEvent::ResumeGame, "继续游戏"),
(GameEvent::PlayerDied, "玩家死亡"),
(GameEvent::PlayerDied, "玩家再次死亡"),
(GameEvent::PlayerWon, "玩家胜利"),
(GameEvent::RestartGame, "重新开始"),
(GameEvent::QuitToMenu, "退出到菜单"),
];
for (event, description) in game_flow {
println!("\n执行: {}", description);
// 在游戏中时增加一些分数
if game.state == GameState::Playing {
game.add_score(100);
}
match game.handle_event(event) {
Ok(message) => {
println!("结果: {}", message);
println!("状态: {}", game.status());
}
Err(error) => {
println!("错误: {}", error);
}
}
}
// 演示复杂的游戏场景
println!("\n复杂游戏场景:");
let mut game2 = GameStateMachine::new();
let _ = game2.handle_event(GameEvent::StartGame);
// 模拟游戏过程
for round in 1..=5 {
game2.add_score(round * 50);
println!("第{}轮: {}", round, game2.status());
if round == 3 {
let _ = game2.handle_event(GameEvent::PlayerDied);
println!("玩家在第3轮死亡: {}", game2.status());
}
}
// 最终胜利
match game2.handle_event(GameEvent::PlayerWon) {
Ok(message) => println!("\n{}", message),
Err(e) => println!("错误: {}", e),
}
}
rustc state_machine.rs && ./state_machine
本章小结
通过本章学习,你应该掌握了:
✅ 条件语句: if表达式、match模式匹配、守卫条件 ✅ 循环结构: loop、while、for循环及其控制 ✅ 迭代器: 创建、适配器、消费者、自定义迭代器 ✅ 闭包: 语法、捕获模式、特征、高级应用 ✅ 错误处理: Option/Result控制流、错误传播、恢复策略 ✅ 状态机: 设计模式、状态转换、事件处理
下一章预告
在下一章《模块系统》中,我们将学习:
- 模块定义和组织
- 可见性和访问控制
- 包和Crate管理
- 外部依赖使用
- 项目结构最佳实践
练习题
练习1:计算器状态机
实现一个计算器状态机,支持基本的四则运算和状态管理。
练习2:自定义迭代器
创建一个素数迭代器,能够生成指定范围内的所有素数。
练习3:错误处理链
设计一个文件处理系统,包含完整的错误处理和恢复机制。
练习4:函数式数据处理
使用闭包和迭代器实现一个数据分析工具,支持过滤、映射、聚合等操作。
恭喜你掌握了Rust的控制流! 🎉
控制流是程序逻辑的核心,Rust的控制流结构既强大又安全。配合所有权系统和类型系统,你可以编写出既高效又可靠的程序。现在让我们继续学习模块系统!