深入掌握Rust模式匹配的各种语法:解构、守卫、绑定、refutable/irrefutable模式。
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(u8, u8, u8),
}
fn process(msg: Message) {
match msg {
Message::Quit => println!("退出"),
Message::Move { x, y } => println!("移动到({}, {})", x, y),
Message::Write(text) => println!("消息: {}", text),
Message::ChangeColor(r, g, b) => {
println!("颜色: rgb({}, {}, {})", r, g, b);
}
}
}
fn main() {
process(Message::Move { x: 10, y: 20 });
process(Message::Write(String::from("hello")));
}
✅ 编译验证通过
struct Point { x: i32, y: i32 }
fn main() {
let p = Point { x: 0, y: 7 };
let Point { x, y } = p;
let Point { x: a, y: b } = p; // 重命名
let Point { x, .. } = p; // 部分解构
match p {
Point { x: 0, y } => println!("在y轴: {}", y),
Point { x, y: 0 } => println!("在x轴: {}", x),
Point { x, y } => println!("({}, {})", x, y),
}
}
✅ 编译验证通过
fn main() {
let num = Some(4);
match num {
Some(x) if x % 2 == 0 => println!("偶数: {}", x),
Some(x) => println!("奇数: {}", x),
None => println!("无值"),
}
let threshold = 10;
match 15 {
n if n > threshold => println!("{} > {}", n, threshold),
n => println!("{} <= {}", n, threshold),
}
}
✅ 编译验证通过
fn main() {
let age = 25;
match age {
n @ 0..=12 => println!("儿童: {}岁", n),
n @ 13..=19 => println!("青少年: {}岁", n),
n @ 20..=59 => println!("成年人: {}岁", n),
n @ 60.. => println!("老年人: {}岁", n),
}
}
✅ 编译验证通过
let x = 5;中的x)Some(x))let、for只接受irrefutable;if let、match接受refutable。
fn main() {
// ✅ Irrefutable
let (x, y) = (1, 2);
// ❌ Refutable不能用在let中
// let Some(x) = Some(5); // 警告
// ✅ let-else (Rust 1.65+)
let Some(x) = Some(5) else {
return;
};
println!("x = {}", x);
}
✅ 编译验证通过
enum Expr {
Lit(i32),
Add(Box<Expr>, Box<Expr>),
Mul(Box<Expr>, Box<Expr>),
Neg(Box<Expr>),
}
fn eval(e: &Expr) -> i32 {
match e {
Expr::Lit(n) => *n,
Expr::Add(a, b) => eval(a) + eval(b),
Expr::Mul(a, b) => eval(a) * eval(b),
Expr::Neg(a) => -eval(a),
}
}
设计JSON值枚举并实现打印。
用模式匹配解析"ADD/GET/DEL key [value]"命令。
掌握Rust模式匹配——最优雅的特性之一
Rust的设计遵循几个核心原则,理解这些原则能帮助你更好地使用Rust:
Rust要求你显式声明可变性(mut)、生命周期、错误处理。没有隐式类型转换、没有隐式异常传播、没有隐式GC。虽然代码更冗长,但行为更可预测。
借用检查器、生命周期分析、trait约束——所有这些都在编译期完成。这意味着运行时零开销。你付出的代价是编译时间,换来的是运行时性能和安全。
高层抽象(泛型、trait、迭代器、async/await)编译后与手写底层代码一样高效。你不需要在抽象和性能之间做选择。
所有其他特性——借用检查、生命周期、并发安全——都建立在所有权模型之上。理解所有权,就理解了Rust。
| 年份 | 里程碑 |
|---|---|
| 2006 | Graydon Hoare开始Rust项目 |
| 2009 | Mozilla开始赞助 |
| 2010 | 首次公开 |
| 2012 | 第一个预发布版 |
| 2015 | Rust 1.0发布 |
| 2016-2024 | 连续Stack Overflow最受喜爱语言 |
| 2022 | Linux内核接纳Rust |
| 2023 | Android、Windows开始使用Rust |
| 2024 | Rust基金会成立,生态系统成熟 |
| 2026 | 你正在学习Rust! |
基础阶段(1-2周):完成本课程第1-7课,重点理解所有权和借用。
进阶阶段(2-3周):完成第8-14课,掌握trait、泛型、智能指针。
系统阶段(2-3周):完成第15-21课,实际写并发程序。
网络阶段(2-3周):完成第22-28课,构建真实的网络服务。
实战阶段(持续):完成第29-35课,开始自己的项目。
以下资源帮助你深入学习本课主题:
本课涉及的核心概念,确保你理解每一个:
| 术语 | 说明 |
|---|---|
| 所有权 | Rust内存管理的核心机制,每个值有唯一所有者 |
| 借用 | 通过引用访问数据,不获取所有权 |
| 生命周期 | 引用有效的范围,编译期分析工具 |
| trait | Rust的接口/抽象机制,类似其他语言的接口 |
| 泛型 | 参数化类型,零成本抽象 |
| 模式匹配 | 强大的数据解构和分支机制 |
| 零成本抽象 | 高层抽象不引入运行时开销 |
| fearless concurrency | 编译器保证线程安全 |
Q: Rust学习曲线真的很陡吗?
A: 前期确实需要适应所有权和借用检查器,但一旦理解了,这些概念会让你的代码更可靠。大多数人2-4周就能上手。
Q: Rust适合什么项目?
A: 系统编程、Web服务、CLI工具、嵌入式、WASM、网络服务、数据库等。基本上需要性能和安全的地方都适合。
Q: 遇到编译错误怎么办?
A: Rust编译器的错误信息非常友好!仔细阅读,通常会指出问题所在和修复建议。也可以用cargo clippy获取更多提示。