当前位置: 首页 > 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

相关文章:

  • vim 练习题
  • Linux 系统如何挂载U盘
  • 动态规划问题 -- 多状态模型(打家劫舍II)
  • 基于STM32、HAL库的ADAU1701JSTZ-RL音频接口芯片驱动程序设计
  • 【ArcGIS】根据shp范围生成系列等距点:范围外等距点+渔网点(Python全代码)
  • Windows系统配置WSL2及Cuda
  • 在spark中配置历史服务器
  • Weblogic 反序列化远程命令执行漏洞 CVE-2019-2725 详解
  • 【25软考网工】第六章(5)应用层安全协议
  • vue 中绑定样式 【class样式绑定】
  • 【Ubuntu】扩充磁盘大小
  • langchain提示词的使用
  • 《算法导论(第4版)》阅读笔记:p39-p48
  • 电子电器架构 --- 区域计算架构(Zonal Compute)备战下一代电子电气架构
  • 重庆医科大学附属第二医院外科楼外挡墙自动化监测
  • 保护数据安全的关键一步-安装加密软件
  • 修复aosp中QQ无法跳转到短信的问题
  • 【android bluetooth 框架分析 02】【Module详解 6】【StorageModule 模块介绍】
  • 关于 js:8. 反调试与混淆识别
  • 基于javaweb的SpringBoot酒店管理系统设计与实现(源码+文档+部署讲解)
  • 山西临汾哪吒主题景区回应雕塑被指抄袭:造型由第三方公司设计
  • 持续8年仍难终了的纠纷:败诉方因拒执罪被立案,胜诉方银行账户遭冻结
  • 库尔德工人党决定自行解散
  • 国内首例侵入式脑机接口系统前瞻性临床试验:受试者已能用意念玩游戏
  • 7月打卡乐高乐园,还可以去千年古镇枫泾参加这个漫画艺术季
  • 姚洋将全职加盟上海财经大学,担任滴水湖高级金融学院院长