Rust编程-模式匹配

模式:

        用来匹配类型结构

        组成:字面量、解体的数组、元组、枚举、结构体 、变量、通配符、占位符等组件组成

模式匹配的作用:

        模式与match或其他工具配合使用可以更好控制流程

match分支:

        

match 值 {模式 => 表达式
}

        match分支要求必须穷尽匹配值的所有可能性

        可以在最后一个分支上使用全匹配模式:

                使用一个可以匹配任何值的变量名

                使用_模式

if let条件表达式:

        可以混用if let 、else if、else if let 、else

        不会要求开发者穷尽所有可能性

 where let 循环:

        循环匹配

  for循环:

        for语句中紧跟for关键字的就是一个模式

let语句:

        

let PATTERN = EXPRESSION;let (x, y, z) = (1, 2, 3); // let 结构元组

如果模式中的元素数量和表达式中的不同,会引发错误

可以使用使用_或..语法忽略元组中的元素,_只能匹配一个,.. 可以匹配多个

 函数的参数:

        函数的参数也是模式

        可以在函数参数中使用模式去匹配元组

        

fn print_coordinates(&(x, y): &(i32, i32)) {}

        可以在闭包的参数列表中使用模式

 模式在不同上下文中的运作机制

        模式可以被分为不可失败(irrefutable)和可失败(refutable)两种类型。

        不可失败性:let x = 5;

                函数参数、let语句及for循环只接收不可失败模式

        可失败性:let Some(x) = a_value

                if let和whilelet表达式则只接收可失败模式

        注意:编写代码时不需要考虑模式的可失败性,但需要知道概念,在异常信息中能够识别。

    模式语法:            

                匹配字面量:

                        

match 1 {1 => println!("one"),2 => println!("two"),_ => println!("other"),}
                匹配变量:
let x = Some(50);match x {...
}

match表达式创建的新作用域:

        

 let x = Some(5);let y = 10;match x {Some(50) => println!("50"),Some(y) => println!("Matched,y={:?}", y),_ => println!("other"),}

会匹配到第二个分支,这里的y在match创建的作用域内,是一个新的变量,不是x后面的y变量

        多重模式

                使用“|” 来实现多重模式匹配

        

let x = 1;
match x {1 | 2 => println!("one or two"),3 => println!("three"),_ => println!("anywhere"),
}
         ..= 来匹配值区间

            ..= 是为了解决 | 一次只能添加一个值的复杂性;

            使用“. .= '表示包含范围,包含起止

             范围模式只允许数字和char类型的数值使用

结构分解值:

            模式来分解结构体、枚举、元组或引用

             解构结构体:
let p = Point { x: 0, y: 7 };match p {Point { x, y: 0 } => println!("On the x axis at {}", x),Point { x: 0, y } => println!("On the y axis at {}", y),Point { x, y } => println!("On neither axis: ({}, {})", x, y),}
           结构枚举:

                

 let msg = Message::ChangeColor(1, 2, 3);match msg {Message::Quit => println!("Quit"),Message::Move { x, y } => println!("Move {},{}", x, y),Message::Write(text) => print!("write {}", text),Message::ChangeColor(r, g, b) => {println!("change the color to red {},green {},and blue {}", r, g, b)}}enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}
        嵌套枚举

                

let msg = Message::ChangeColor(Color::Hsv(0, 160, 255));match msg {Message::ChangeColor(Color::Rgb(r, g, b)) => println!("Rgb,{},{},{}", r, g, b),Message::ChangeColor(Color::Hsv(h, s, v)) => print!("Hsv,{},{},{}", h, s, v),_ => (),}
        嵌套结构体和元组

        

let ((feet, inches), Point {x, y}) = ((3, 10), Point { x: 3, y: -10 });

        使用_忽略:

        

let numbers = (2, 4, 8, 16, 32);
match numbers {
(first, _, third, _, fifth) => {
println!("Some numbers: {}, {}, {}", first, third, fifth)
},
}

  _ 不一定非要放到最后

.. 两个点,可以省略多个值,也一定要放到最后

        匹配守卫

        match分支模式后的if条件语句

        

let x = Some(5);
let y = 10;
match x {
Some(50) => println!("Got 50"),
Some(n) if n == y => println!("Matched, n = {:?}", n),
_ => println!("Default case, x = {:?}", x),
}

条件中的y就是来自表达式外部的y, 匹配守卫if n == y不是一个模式,所以它不会引入新的变量.能够比较n和y的值是否相同。

        @绑定

        @运算符允许在测试一个值是否匹配模式的同时创建存储该值的变量

   enum Message {Hello { id: i32 },}let msg = Message::Hello { id: 5 };match msg {Message::Hello {id: id_variable @ 3..=7,} => {println!("Found an id in range: {}", id_variable)}Message::Hello { id: 10..=12 } => {println!("Found an id in another range")}Message::Hello { id } => {println!("Found some other id: {}", id)}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】从前序与中序遍历序列构造二叉树

目录 一、题目二、解法完整代码 一、题目 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9…

在西藏上大学是一种什么体验?如何解决语言问题?

在西藏地区上大学是一种独特而难忘的经历,它不仅提供了接触壮丽自然风光和深入了解藏族文化的机会,也带来了适应高原气候和生活方式的挑战。学生将在这里体验到丰富的教育资源和学术研究素材,同时在生活和人际交往中培养适应能力和独立性。这…

密码学基础-Hash、MAC、HMAC 的区别与联系

密码学基础-Hash、MAC、HMAC 的区别与联系 Hash Hash 是一种从一段数据中创建小的数字“指纹”的方法。就像一个人的指纹代表一个人的信息一样,Hash 对输入的数据进行整理,生成一个代表该输入数据的“指纹” 数据。通常该指纹数据也可称之为摘要、散列…

文件包含漏洞: 函数,实例[pikachu_file_inclusion_local]

文件包含 文件包含是一种较为常见技术,允许程序员在不同的脚本或程序中重用代码或调用文件 主要作用和用途: 代码重用:通过将通用函数或代码段放入单独的文件中,可以在多个脚本中包含这些文件,避免重复编写相同代码。…

RabbitMQ的学习和模拟实现|Protobuf的介绍和简单使用

protbuf的介绍和简单使用 项目仓库:https://github.com/ffengc/HareMQ protobuf的安装:README-cn.md#环境配置 基于Protobuf的一个小项目:基于protobuf和httplib的在线通讯录项目框架|Protobuf应用小项目 protobuf是什么 Pro…

TinyVue:与 Vue 交往八年的组件库

本文由体验技术团队莫春辉老师原创~ 去年因故停办的 VueConf,今年如约在深圳举行。作为东道主 & 上届 VueConf 讲师的我,没有理由不来凑个热闹。大会结束后,我见裕波在朋友圈转发 Jinjiang 的文章《我和 Vue.js 的十年》,我就…

openlayers 3d 地图 非三维 立体地图 行政区划裁剪 地图背景

这是实践效果 如果没有任何基础 就看这个专栏:http://t.csdnimg.cn/qB4w0 这个专栏里有从最简单的地图到复杂地图的示例 最终效果: 线上示例代码: 想要做这个效果 如果你的行政区划编辑点较多 可能会有卡顿感 如果出现卡顿感需要将边界点相应…

Python爬虫-淘宝搜索热词数据

前言 本文是该专栏的第70篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细针对“亚马逊Amazon搜索热词”数据采集的详细介绍,对此感兴趣的同学,可以往前翻阅《Python爬虫-某跨境电商(AM)搜索热词》进行查看。 而在本文,笔者将以淘宝为例,获取…

【扩散模型(五)】IP-Adapter 源码详解3-推理代码

系列文章目录 【扩散模型(一)】中介绍了 Stable Diffusion 可以被理解为重建分支(reconstruction branch)和条件分支(condition branch)【扩散模型(二)】IP-Adapter 从条件分支的视…

【OAuth2系列】集成微信小程序登录到 Spring Security OAuth 2.0

作者:后端小肥肠 创作不易,未经允许严禁转载。 姊妹篇: 【Spring Security系列】权限之旅:SpringSecurity小程序登录深度探索_spring security 微信小程序登录-CSDN博客 目录 1. 前言 2. 总体登录流程 3. 数据表设计 3.1. sys…

Python测试服务器连接的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

windows server——4.安装DNS管理器

windows server——4.安装DNS管理器 一、准备二、安装DNS管理器1.打开服务器管理器2.添加dns服务器 三、验证 一、准备 windows server电脑(已安装IIS) 静态网站数据包 二、安装DNS管理器 1.打开服务器管理器 2.添加dns服务器 点击管理——添加角色和…

Java语言程序设计基础篇_编程练习题*15.16(两个可移动的顶点以及它们间的距离)

*15.16(两个可移动的顶点以及它们间的距离) 请编写一个程序,显示两个分别位于(40,40)和(120,150) 的半径为10的圆,并用一条直线连接两个圆,如图15-28b所示。圆之间的距离显示在直线上。 用户可以拖动圆&am…

指标平台新书发布:智能驱动,数据管研用一体化新革命

在当下数字化经营的市场环境中,企业面临着前所未有的挑战和机遇。随着业务的不断扩展和市场的日益复杂,数据作为企业的核心资产,其重要性愈发凸显。然而“数据孤岛和数据不清晰”这一问题却成为了制约企业数字化进程和竞争力的关键因素。为了…

Windows下载、安装、部署Redis服务的详细流程

本文介绍在Windows电脑中,下载、安装、部署并运行Redis数据库服务的方法。 Redis(Remote Dictionary Server)是一个开源、高性能的键值存储系统,最初由Salvatore Sanfilippo在2009年发布,并由Redis Labs维护。Redis因其…

软考高级第四版备考--第27天(项目工作绩效域)

核心概念: 项目工作可使团队保持专注,并使项目活动顺序进行实现的预期目标主要包含:高效且有效的项目绩效;适合项目和环境的项目过程;干系人适当的沟通和参与;对实物资源进行了有效的管理;对采购进行有效管…

创建React应用的2种方式

一、使用create-react-app创建 1、全局安装脚手架库: create-react-app npm i -g create-react-app 2、创建项目:create-react-app (my-app)项目名称; create-react-app my-app 3、进入项目文件夹 cd my-app 4、运行项目 npm start 二、使用vite创建&…

<数据集>水果识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:10012张 标注数量(xml文件个数):10012 标注数量(txt文件个数):10012 标注类别数:7 标注类别名称:[Watermelon, Orange, Grape, Apple, peach, Banana, Pineapple] 序…

自建网站统计工具 Umami 替代 Google Analytics

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 Umami 是一款开源的网站统计工具,与 Google Analytics 相比更加的轻量,且不会收集网站用户的个人信息。同时,Umami 的仪表盘界面简洁,UI 精美,方便我们查看网站的历史统计数据。 Umami 使用方式也与 Google Ana…

n7.Nginx 第三方模块

Nginx 第三方模块 第三模块是对nginx 的功能扩展,第三方模块需要在编译安装Nginx 的时候使用参数–add-modulePATH指定路径添加,有的模块是由公司的开发人员针对业务需求定制开发的,有的模块是开 源爱好者开发好之后上传到github进行开源的模…