59_模式匹配

1. 概述

模式匹配是rust的一种特殊语法,用于匹配复杂和简单类型的结构,将模式与匹配表达式和其他结构结合使用,可以更好地控制程序的控制流。

模式由以下元素(的一些组合)组成

  • 字面值
  • 解析的数组、enum、struct和tuple
  • 变量
  • 通配符
  • 占位符

想要使用模式,需要将其与某个值进行比较,如果模式匹配,就可以在代码中使用这个值的相应部分。下文将介绍rust中使用到模式匹配的地方。

2. match的Arm(分支)

rust 复制代码
match VALUE {
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
}

match表达式的要求是详尽,即包含所有的可能性。一个特殊的模式是_(下划线),它会匹配到任何东西,不会绑定到变量,所以通常用户match的最后一个分支,或者用于忽略某些值。

3. 条件if let表达式

if let主要是作为一种简短的方式来等价的代替只有一个匹配项的match。 if let可选可以拥有else,包括:

  • else if
  • else if let

但是if let不会检查穷尽性。

例如:

rs 复制代码
fn main() {
    let favorite_color: Option<&str> = None; // 定义一个名为favorite_color的变量,其类型为Option<&str>,即字符串的引用(如果有的话)
    let is_tuesday = false; // 定义一个名为is_tuesday的变量,其类型为bool,值为false
    let age: Result<u8, _> = "34".parse(); // 定义一个名为age的变量,其类型为Result<u8, _>,即u8的结果(解析一个字符串得到一个数字)

    if let Some(color) = favorite_color {
        // 如果favorite_color是Some(即有值)
        println!("Using your favorite color, {}, as the background", color); 
    } else if is_tuesday {
        // 如果is_tuesday为true
        println!("Tuesday is green day!"); 
    } else if let Ok(age) = age {
        // 如果age解析成功
        if age > 30 {
            println!("Using purple as the background color"); 
        } else {
            println!("Using orange as the background color"); 
        }
    } else {
        // 其他情况
        println!("Using blue as the background color"); 
    }
}

4. while let条件循环

只要模式匹配继续满足匹配的条件,那它允许while循环一直运行。如下示例

rust 复制代码
fn main() {
    let mut stack = Vec::new();

    statck.push(1);
    statck.push(2);
    statck.push(3);

    while let Some(top) = stack.pop() {
        println("{}", top);
    }
}

5. for循环

for循环是rust中最常见的循环,for循环中,模式就是紧随for关键字后的值。

如下示例代码:

rust 复制代码
fn main() {
    let v = vec!['a', 'b', 'c'];

    for (index, value) in v.iter().enumerate() {
        println("{} is at index {}", value, index);
    }
}

6. let语句

let语句也是模式,官方写法为let PATTERN = EXPRESSION;,如下示例代码

rust 复制代码
fn main() {
    let a = 5;
    
    let (x, y, z) = (1, 2, 3);
    let (v, w) = (1,2,3)
}

7. 函数参数

函数参数也是模式,如下示例代码

rust 复制代码
fn foo(x: i32) {
    // code goes here
}

fn print_coordinates(&(x, y): &(i32, i32)) {
    println("Current location: ({}, {})", x, y);
}

fn main() {
    let point = (3, 5);
    print_coordinates(&point);
}
相关推荐
腻害兔4 分钟前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
CodexDave20 分钟前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
Ai_easygo1 小时前
AI Agent开发入门——从ReAct到Tool Calling,拆解Agent的底层运行逻辑
前端·人工智能·react.js
研☆香1 小时前
分析制作html页面,如何划分页面结构
前端
kyriewen2 小时前
我扒了最近的前端面经——2026年面试不背八股文了,考这5样
前端·面试·ai编程
IT_陈寒2 小时前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
小徐_23332 小时前
uni-app 项目别再从零搭了!3 个 Wot UI 起手模板怎么选?
前端·uni-app
赵庆明老师3 小时前
Vben精讲:16-熟悉Vite前端工具链
前端
脱胎换骨-军哥5 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
songroom5 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust