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);

相关推荐
Wild_Pointer.2 小时前
项目实战:编写CMakeLists管理Qt+OpenCV项目
开发语言·c++·qt
莫逸风2 小时前
【java-core-collections】集合框架深度解析
java·开发语言
IT_陈寒2 小时前
Python的GIL把我CPU跑满时我才明白并发不是这样玩的
前端·人工智能·后端
geovindu2 小时前
go: Bridge Pattern
开发语言·设计模式·golang·软件构建·桥接模式
小江的记录本2 小时前
【分布式】分布式系统核心知识体系:CAP定理、BASE理论与核心挑战
java·前端·网络·分布式·后端·python·安全
Fate_I_C2 小时前
Kotlin 为什么是 Android 开发的首选语言
android·开发语言·kotlin
格鸰爱童话2 小时前
python录音转文字
开发语言·python
常利兵2 小时前
Kotlin 助力 Android 启动“大提速”
android·开发语言·kotlin
黎梨梨梨_2 小时前
C++入门基础(上)(namespace和缺省参数)
开发语言·c++