当前位置: 首页 > news >正文

Pattern and Match

在 Rust 中,模式(pattern)是用来匹配某种结构化数据的语法结构。你可以把它理解为“结构匹配模板” —— Rust 根据这个模板去“解构”或“检查”一个值。

在这些语法中会使用“模式”:

  • let 声明
  • 函数和闭包的参数。
  • 匹配(match)表达式
  • if let 表达式
  • while let 表达式
  • for 表达式

Rust 的模式可以非常丰富,下面是 Rust 部分合法模式的分类和举例

通用模式分类

下面 PATTERN 代表模式

  • match

    match expr { PATTERN => ... }
    
  • let

    let PATTERN = ...
    
  • 附加 if 条件

    match expr { PATTERN if cond => ... }
    
  • for 循环

    for PATTERN in iter
    
  • if let

    if let PATTERN = expr
    
  • 函数参数

    fn func(PATTERN: Type)
    
  • while let

    while let PATTERN = expr
    

例子

通配符模式
match x {_ => println!("anything"),    // `_` 匹配任意值,但不会绑定。
}
字面量模式
// 匹配常量值、数字、字符、布尔、字符串等。
match x {1 => ...,'a' => ...,true => ...,
}
4. 路径模式(常量路径)
const A: i32 = 10;
enum Color { Red, Green, Blue }// 匹配常量或枚举路径。
match x {A => ...,Color::Red => ...,
}
数组/切片模式
let arr = [1, 2, 3, 4];// 匹配固定大小的数组(可部分使用 `..`)。
match arr {[a, b, ..] => ...,[1, .., 4] => ...,
}
模式组合
// 使用 `|` 连接多个模式(类似“或”逻辑)。
match x {1 | 2 | 3 => println!("1, 2, or 3"),
}
嵌套模式
// 模式中嵌入其他模式组合。
match something {Some((x, y)) => ...,_ => {},
}if let Some((x, y)) = some_tuple_opt {^^^^^ 模式 ← 解构嵌套元组println!("{x}, {y}");
}
范围模式(仅适用于整数和字符)
  • 匹配范围。
match x {1..=10 => println!("in range"),'a'..='z' => println!("lowercase letter"),
}
引用模式
// `&` 用于解构引用
let x = &5;
match x {&val => println!("{val}"),
}// `ref` 用于绑定引用变量
let x = 5;
match x {ref r => println!("r is a reference to x: {}", r),
}

绑定模式(@ 绑定)

// 将匹配的值绑定到变量,同时验证模式
match 15 {x @ 1..=10 => "1-10",  // x = 15(不匹配)x @ 11..=20 => "11-20", // x = 15(匹配)_ => "other",
}
标识符绑定模式
let x = 5;
let y = x;           // `name` 绑定当前值到变量名。
let ref r = x;       // 引用绑定
let ref mut m = x;   // 可变引用绑定
结构体/枚举结构模式
// 匹配结构体
struct Point { x: i32, y: i32 }
let p = Point { x: 1, y: 2 };// 匹配枚举结构。
enum Shape { Circle(i32), Rectangle { w: i32, h: i32 } }
let Shape::Rectangle { w, h } = shape;let x = Some(5);
if let Some(v) = x {^^^^^ 模式 ← 解构 Some 并绑定 vprintln!("v = {v}");
}
元组模式
// 匹配元组的每个元素
let (a, b) = (1, 2);
守卫模式(if guards)
match x {n if n > 10 => println!("greater than 10"),_ => {},
}
忽略剩余部分(Ignore Remaining ..
// 用 `..` 忽略未明确指定的部分:
struct S { a: i32, b: i32, c: i32 }
let s = S { a: 0, b: 1, c: 2 };
let S { a, .. } = s;  // 只绑定 `a`,忽略 `b` 和 `c`
类型转换模式(as Patterns)
// 将匹配的值转换为特定类型
let x: u8 = 1;
match x {n as u16 => println!("u16: {}", n),  // 转换类型
}
联合模式(Union Patterns)
// 用于匹配 `union` 类型的字段(需 `unsafe`):
union MyUnion { i: i32, f: f32 }
let u = MyUnion { i: 42 };
unsafe {match u {MyUnion { i: 42 } => "matched integer",_ => "other",}
}

官方文档参考

  • Rust Reference: Patterns
  • The Rust Book - Patterns
http://www.xdnf.cn/news/422029.html

相关文章:

  • 【Qwen3 + MCP】快速打造一个免费的Qwen AI图像生成助手
  • 【前缀和】和为 K 的子数组(medium)
  • 数据清洗案例
  • 开源自定义Python库并上传到PyPi
  • 基于几何布朗运动的股价预测模型构建与分析
  • 华为0507机试
  • 【力扣】K个一组翻转链表
  • aardio - godking.vlistEx.listbar + win.ui.tabs 实现多标签多页面切换
  • llamafactory-记录一次消除模型随机性的成功过程
  • VSCode中Node.js 使用教程
  • WPF自定义控件开发全指南:多内容切换与动画集成
  • 基于深度学习的水果识别系统设计
  • 蛋白设计 ProteinMPNN
  • go语言学习进阶
  • Telnet 类图解析
  • 题海拾贝:P1833 樱花
  • 不用服务器转码,Web端如何播放RTSP视频流?
  • 多线程代码案例-1 单例模式
  • 在spark中配置历史服务器
  • 【C++】深入理解 unordered 容器、布隆过滤器与分布式一致性哈希
  • 拓扑排序详解
  • H5S 视频监控AWS S3 对象存储
  • BGP实验练习2
  • Github 2025-05-13 Python开源项目日报 Top10
  • 从零开始:使用 Vue-ECharts 实现数据可视化图表功能
  • 详解Windows(十一)——网络连接设置
  • 解锁ozon运营新路径:自养号测评技术如何实现降本增效
  • CSS结构性伪类、UI伪类与动态伪类全解析:从文档结构到交互状态的精准选择
  • 【Flask全栈开发指南】从零构建企业级Web应用
  • Vue3+uniapp 封装axios