rust match表达式

文章目录

    • match使用
    • match语法糖【if let】
    • 匹配Option<T>

match使用

在rust中提供了一个极为强大的控制流运算符match

  • match允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码
  • 这些模式可以是子面值变量名通配符等等

来个例子

fn main() {println!("penny {}", value_in_cents(Coin::Penny)) // penny 1
}enum Coin {Penny,Nickel,Dime,Quarter,
}fn value_in_cents(coin: Coin) -> u8 {match coin {Coin::Penny => 1,Coin::Nickel => 5,Coin::Dime => 10,Coin::Quarter => {println!("多行的情况需要加上花括号");25},}
}

绑定值的模式

匹配的分支可以绑定到被匹配对象的部分值,因此我们可以从enum变体中获取值

fn main() {println!("penny {}", value_in_cents(Coin::Quarter(UsState::Alabama))) // State quarter from Alabama\n penny 25 
}#[derive(Debug)]
enum UsState {Alabama,Alaska,
}enum Coin {Penny,Nickel,Dime,Quarter(UsState),
}fn value_in_cents(coin: Coin) -> u8 {match coin {Coin::Penny => 1,Coin::Nickel => 5,Coin::Dime => 10,// 绑定值的模式匹配Coin::Quarter(state) => {println!("State quarter from {:?}", state);25},}
}

在rust的match匹配中,必须要穷举所有的变体

但是如果match要匹配的变体太多了,我们不想处理那么多该怎么办呢?

  • 可以使用通配符_来替代其余没列出的值
fn main() {let v = 0u8;match v {1 => println!("one"),2 => println!("two"),3 => println!("three"),// 其他的不想匹配了,可以使用`_`替代,下换线通配符只能放到最后一行_ => println!("other")}
}

match语法糖【if let】

上述的例子可以使用if let控制流进行改写

fn main() {let v = 0u8;match v {1 => println!("one"),2 => println!("two"),3 => println!("three"),// 其他的不想匹配了,可以使用`_`替代,下换线通配符只能放到最后一行_ => println!("other"),}// 可以使用let进行简写if let 3 = v {println!("three");} else {println!("other")}
}

小结一下if let的作用

  • 处理只关心一种匹配二忽略其他匹配的情况
  • 更少的代码、更少的缩进、更少的模板代码
  • 放弃了穷举的可能
  • 我们可以把if let当做是match的语法糖

匹配Option

fn main() {let five = Some(5);let six = plus_one(five);let none = plus_one(None);// 使用模式匹配和Option可以避免其他语言出现NPE的问题match six {Some(value) => println!("six: {}", value),None => println!("six: None"),}match none {Some(value) => println!("none: {}", value),None => println!("none: None"),}
}fn plus_one(x: Option<i32>) -> Option<i32> {match x {None => None,Some(i) => Some(i + 1)}
}

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

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

相关文章

SHELL——备份脚本

编写脚本&#xff0c;使用mysqldump实现分库分表备份。 1、获取分库备份的库名列表 [rootweb01 scripts]# mysql -uroot -p123456 -e "show databases;" | egrep -v "Database|information_schema|mysql|performance_schema|sys" mysql: [Warning] Using …

尚医通总结(面试模板篇)

视频&#xff1a; 笔记&#xff1a; 一、 项目介绍 尚医通即为网上预约挂号系统&#xff0c;网上预约挂号是近年来开展的一项便民就医服务&#xff0c;旨在缓解看病难、挂号难的就医难题&#xff0c;许多患者为看一次病要跑很多次医院&#xff0c;最终还不一定能保证看得上医生…

游戏开发人员如何从 Splashtop 中受益

游戏开发时代在不断发展&#xff0c;远程办公、协作和高性能需求变得越来越普遍。因此&#xff0c;对复杂工具的需求不断增加&#xff0c;这些工具不仅可以满足这些需求&#xff0c;还可以为开发人员提供无缝体验。 其中一个工具是 Splashtop Business Access Performance&…

互联网——根服务器

说明 根服务器是互联网域名系统&#xff08;DNS&#xff09;中最高级别的服务器之一。它们负责管理整个DNS系统的顶级域名空间&#xff0c;例如.com、.org和.net等。 根服务器的主要功能是将用户的DNS查询转发到适当的顶级域名服务器。当用户在浏览器中输入一个域名&#xff…

Linux nohup 命令详解

nohup是Linux/Unix系统中非常有用的命令之一。它允许您在后台运行命令或脚本&#xff0c;并且在退出终端会话后仍然保持运行。这对于长时间运行的任务或进程非常有用&#xff0c;特别是当您需要离开终端但希望任务继续运行时。 nohup命令语法 nohup命令的基本语法如下&#x…

Redis持久化两种方案以及对比差异

1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#xff0c;恢复数据。快照文件称为R…

2023网络安全学习路线 非常详细 推荐学习

首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#xff0c;更多的人会倒在学习语言上&#xff1b; 2、知识点掌握程度不清楚 对于网络安…

微信多开(双开三开均可,且不局限于微信,其他设备亦可)

1.鼠标右键“微信”&#xff0c;属性 如上图&#xff0c;自动选取的&#xff0c;别动&#xff0c;然后CtrlC,,,,结果如下 "C:\Program Files (x86)\Tencent\WeChat\WeChat.exe" 2.创建文本&#xff0c;电脑桌面空白处单击&#xff0c;新建&#xff0c;文本档案&#…

小白玩转浏览器开发者工具—F12(超详细)

目录 1、检查元素&#xff1a;&#x1f680; 2、修改样式&#xff1a;&#x1f6eb; 3、调试代码&#xff1a;&#x1f451; 4、网络分析&#xff1a;&#x1f682; 5、控制台输出&#xff1a;&#x1f681; 6、移动设备模拟&#xff1a;&#x1f3a8; 7、缓存管理&…

“单片机定时器:灵活计时与创新功能的关键“

学会定时器的使用对单片机来说非常重要&#xff0c;因为它可以帮助实现各种时序电路。时序电路在工业和家用电器的控制中有广泛的应用。 举个例子&#xff0c;我们可以利用单片机实现一个具有按钮控制的楼道灯开关。当按钮按下一次后&#xff0c;灯会亮起并持续3分钟&#xff…

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;FFmpe…

无涯教程-Lua - 条件判断

if结构要求程序员确定一个或多个要由程序判断或测试的条件&#xff0c;以及要确定的条件为真的情况下要执行的一条或多条语句&#xff0c;如果条件为真&#xff0c;则执行指定语句&#xff0c;如果条件为假&#xff0c;则执行其他语句。 Lua编程语言假定布尔值 true 和 non-nil…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(六)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

Linux systemctl 简单介绍与使用

在Linux下&#xff0c;systemctl是一个管理系统服务的命令。它提供了对systemd服务的控制和管理。 在系统中使用systemctl命令&#xff0c;您可以执行以下操作&#xff1a; 启动服务&#xff1a;systemctl start servicename停止服务&#xff1a;systemctl stop servicename重…

【2023】Git版本控制-远程仓库详解

目录 创建远程仓库向远程仓库推送数据文件从第二台主机本地拉取远程仓库数据第一台主机同步远程仓库数据tag标签git忽略文件 Git远程仓库是Git版本控制系统的一个概念&#xff0c;它是一个存储Git代码的远程服务器。 你可以将本地Git仓库上传到远程仓库&#xff0c;以便与其他…

【机器学习】Classification using Logistic Regression

Classification using Logistic Regression 1. 分类问题2. 线性回归方法3. 逻辑函数&#xff08;sigmod&#xff09;4.逻辑回归5. 决策边界5.1 数据集5.2 数据绘图5.3 逻辑回归与决策边界的刷新5.4 绘制决策边界 附录 导入所需的库 import numpy as np %matplotlib widget imp…

“RISC-V成长日记” blog发布,第一个运行在RISC-V服务器上的blog?

尽管推特、公众号、微博、抖音等社交平台风靡一时&#xff0c;但blog&#xff08;博客&#xff09;在全世界依然经久不衰&#xff0c;尤其是在技术领域。对于博主而言&#xff0c;博客是他们独立创作的天地&#xff0c;可以随时更新内容和故事&#xff0c;确保素材的时效性。此…

SpringBoot根据注解动态执行类中的方法

1、需求 有一个接口提供了xx的服务&#xff0c;有两个场景分别实现了xx的具体逻辑&#xff0c;标记为xx1和xx2。 然后场景一过来的时候执行xx1逻辑&#xff0c;场景二过来的时候执行xx2逻辑。 2、简单实现 定义一个service层&#xff0c;提供xx的接口。 然后定义两个servi…

渗透-02:HTTPS主干-分支和HTTPS传输过程

一、HTTPS主干-分支 第一层 第一层&#xff0c;是主干的主干&#xff0c;加密通信就是双方都持有一个对称加密的秘钥&#xff0c;然后就可以安全通信了。 问题就是&#xff0c;无论这个最初的秘钥是由客户端传给服务端&#xff0c;还是服务端传给客户端&#xff0c;都是明文传输…

Junit单元测试

测试分类 黑盒测试 &#xff1a;不关注代码&#xff0c;只关注输入值之后输出的值是否符合预期。白盒测试&#xff1a;关注代码&#xff0c;需要关注程序具体的执行流程。 Junit单元测试就是白盒测试的一种 Junit使用流程 定义一个测试类&#xff0c;命名为被测试的类名Test …