Rust模式匹配

1. match和 if let

1. match 表达式

  • 作用:Rust 标准多分支模式匹配,替代传统 switch,支持解构、枚举、元组、守卫等复杂匹配。
  • 关键特性:强制穷尽性检查,编译器确保覆盖所有情况,安全无遗漏。
  • 适用:需要处理多分支、全覆盖的场景。

2. if let 语法

  • 作用:match 的简化语法糖 ,专注单分支匹配,忽略其他情况。
  • 关键特性:无穷尽检查,代码更简洁,适合只关心一种模式的场景。
  • 适用:只处理一种情况,其余可忽略(如 Option 的 Some、Result 的 Ok)。

3. 核心区别

特性 match if let
分支 多分支,全覆盖 单分支,可加 else
穷尽检查 强制有
代码量 完整但偏长 极简
场景 全分支处理 单分支聚焦
  • 多分支、需安全全覆盖 → 用 match
  • 仅关心一种分支、其余忽略 → 用 if let
  • 需失败兜底 → if let + else 即可。

2.解构Option

1. 作用

  • 用于表示值可能存在、也可能不存在,替代空值(null),从源头避免空指针错误。
  • 标准库定义:enum Option<T> { Some(T), None }

2. 两种变体

  • Some(T):包含一个有效值 T
  • None:表示没有值

3. 常用处理方式

  • match 匹配:强制全覆盖,安全处理 Some/None
  • if let:简化单分支匹配,只关心 Some 场景
  • unwrap / expect:快速取值,为 None 时会 panic
  • ? 运算符:在函数中快速传播 None 错误

3.适用场景

1. 什么是模式匹配

  • Rust 中 matchif letwhile let、函数参数、let 解构都属于模式匹配
  • 作用:按结构匹配值 ,并自动解构,比 if/else 更强大、更安全。

2. match 基础模式

字面量匹配
复制代码
let x = 5;
match x {
    1 => println!("一"),
    5 => println!("五"),
    _ => println!("其他"),
}
通配符 _

匹配任意值,不绑定变量,常用于兜底。

复制代码
match 10 {
    _ => println!("任意匹配"),
}

3. 解构模式

元组解构
复制代码
let pair = (2, 3);
match pair {
    (2, y) => println!("x=2, y={}", y),
    (x, y) => println!("x={}, y={}", x, y),
}
结构体解构
复制代码
struct Point { x: i32, y: i32 }

let p = Point { x: 10, y: 20 };
match p {
    Point { x, y: 0 } => println!("x={}, y=0", x),
    Point { x, y } => println!("x={}, y={}", x, y),
}
枚举解构(最常用)
复制代码
enum Msg {
    Move { x: i32, y: i32 },
    Click,
}

let msg = Msg::Move { x: 5, y: 5 };
match msg {
    Msg::Move { x, y } => println!("移动到 {},{}", x, y),
    Msg::Click => println!("点击"),
}

4. 忽略部分字段

  • .. 忽略剩余字段

  • _ 忽略单个字段

    struct Data { a: i32, b: i32, c: i32 }

    let d = Data { a:1, b:2, c:3 };
    match d {
    Data { a, .. } => println!("a={}", a),
    }

5. 范围匹配

复制代码
let n = 15;
match n {
    1..=10 => println!("1~10"),
    11..=20 => println!("11~20"),
    _ => (),
}

6. 多重模式 |

复制代码
let c = 'z';
match c {
    'a' | 'e' | 'i' => println!("元音"),
    _ => println!("辅音"),
}

7. 匹配守卫 match guard

if 增加额外条件:

复制代码
let pair = (3, 4);
match pair {
    (x, y) if x + y > 5 => println!("和大于5"),
    (x, y) => println!("和为 {}", x+y),
}

8. @ 绑定

既匹配模式,又把整个值绑定到变量:

复制代码
let n = Some(10);
match n {
    e @ Some(1..=5) => println!("1~5: {:?}", e),
    e @ Some(6..=10) => println!("6~10: {:?}", e),
    None => (),
}

9. 引用模式 & /ref/ref mut

  • & 匹配引用

  • ref 模式中创建引用(不转移所有权)

    let s = Some(5);
    match &s {
    &Some(val) => println!("{}", val),
    &None => (),
    }

    match s {
    Some(ref val) => println!("{}", val), // 不拿走所有权
    None => (),
    }

10. 穷尽性与不可反驳模式

  • match 必须覆盖所有可能(穷尽检查)
  • let/ 函数参数只能用不可反驳模式(一定匹配成功)
复制代码
// 正确
let (a, b) = (1, 2);

// 错误:Some 是可反驳模式,let 不允许
// let Some(x) = Some(5);

相关推荐
她的男孩3 分钟前
从自然语言到数据大屏:Forge Report Studio 的 AI 生成链路
人工智能·后端·架构
她的男孩8 分钟前
大屏动态数据接入:从静态 Mock 到真实业务 API
后端·架构
朔北之忘 Clancy24 分钟前
2026 年 3 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·考级
往上跑山33 分钟前
基于 Harness 工程规范的多智能体交互过程实现
后端
Old Uncle Tom1 小时前
Harness Engineering 综述
java·开发语言·数据库
星原望野1 小时前
JAVA:策略模式的实战使用
java·开发语言·策略模式
码界筑梦坊1 小时前
282-基于Python的豆瓣音乐可视化分析推荐系统
开发语言·python·信息可视化·数据分析·flask·vue
LJianK11 小时前
java多态
java·开发语言·python
_Evan_Yao1 小时前
栈与队列:后进先出与先进先出的智慧
开发语言·python
z落落2 小时前
C# 构造函数(无参/有参/重载/this)+析构函数(终结器)|GC 垃圾回收
java·开发语言·c#