⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

Rust 模式匹配

学习match · 难度:进阶 · +15XP

Rust 模式匹配

模式匹配(Pattern Matching)是 Rust 语言最强大和最常用的特性之一。match 表达式类似于其他语言中的 switch,但功能要强大得多——它可以解构元组和结构体、匹配范围、匹配枚举变体,并且编译器会强制要求你处理所有可能的情况(穷尽性检查),这极大地提升了代码的安全性。

match 的基本用法

match 的基本结构是将一个值与多个模式(也叫分支或 arm)进行比较,匹配成功后执行对应的代码块。每个分支由模式和 => 后的表达式组成,多个分支之间用逗号分隔。match 表达式会返回一个值。

fn main() {
    let number = 3;

let result = match number { 1 => "一", 2 => "二", 3 => "三", 4 | 5 => "四或五", // 多个值可以用 | 组合 6..=10 => "六到十", // 范围匹配 _ => "其他数字", // _ 是通配符,匹配所有未处理的情况 };

println!("数字 {} 对应: {}", number, result); }

匹配 Option 枚举

变体含义匹配语法
Some(value)包含一个有效值Some(v) => println!("值为: {}", v)
None没有值(空)None => println!("没有数据")
Some(_)匹配 Some 但不使用内部值Some(_) => println!("有数据")
fn get_grade(score: Option<u32>) -> String {
    match score {
        None => "未参加考试".to_string(),
        Some(s) if s >= 90 => "优秀".to_string(),
        Some(s) if s >= 80 => "良好".to_string(),
        Some(s) if s >= 60 => "及格".to_string(),
        Some(_) => "不及格".to_string(),
    }
}  // 注意: if 条件叫做"匹配守卫(match guard)"

fn main() { let scores = vec![Some(95), Some(72), None, Some(55)]; for s in &scores { println!("成绩: {}", get_grade(*s)); } }

解构结构体和枚举

struct Point {
    x: i32,
    y: i32,
}

enum Message { Quit, Move { x: i32, y: i32 }, // 匿名结构体变体 Write(String), // 元组变体 ChangeColor(i32, i32, i32), // 元组变体 }

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), } }

if let 和 while let 简洁模式

当你只关心某一种匹配情况时,可以使用 if let 来简化代码。它等价于只处理一个分支的 match,忽略其他所有情况。

  1. 使用 match 编写一个「星期转换器」,输入 1-7 返回对应的中文星期名称
  2. 编写函数,使用 Option 和 match 实现安全除法(除数为 0 时返回 None)
  3. 定义一个 Shape 枚举(Circle, Rectangle, Triangle),用 match 计算不同形状的面积
  4. 使用 if let 简化对 Option 和 Result 类型的处理,并对比与 match 的写法差异
  5. 在 match 中使用匹配守卫(match guard)实现更复杂的条件筛选
Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 122 篇
0 完成
🔥 0