rust 初探 -- 枚举和模式匹配

rust 初探 – 枚举和模式匹配

定义枚举

enum IpAddrKind {// 将数据附加到枚举的变体中// - 不需要额外使用 struct// - 每个变体可以拥有不同的类型以及关联的数据量V4(String), V6(String),
}
  • 可以使用 impl 为枚举定义方法
 enum IpAddrKind {a,b(String),c{x: i32, y: i32},
}impl IpAddrKind {fn call(&self) {}
}fn main() {let aa = IpAddrKind::a;let bb = IpAddrKind::b(String::from("hello"));let cc = IpAddrKind::c { x: 12, y: 21 };bb.call();
}

Option 枚举

  • 定义在标注库中,在 Prelude(预导入模块)中

rust 没有 Null

  • Null 的问题:当你尝试像使用非 Null 值那样使用 Null 值的时候,就会引起某种错误
  • Null 的作用:因某种原因而变为无效或缺失的值(Option)
Option 的优点
  • Option 和 T 是不同的类型,不可以把 Option 直接当作 T
  • 若想使用 Option 中的 T,必须把它转换成 T,避免了错误使用 null 进行操作(非Option 的肯定不是空的,否则就需要转换)
    示例:
fn main() {let x: i8 = 5;let y: Option<i8> = Some(5);//将 Option<T> 中的 T 转换成 Tlet yy = y.expect("get Option<i8> fail");let sum = x + yy;println!("{}", sum)
}

match

  • 允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码(示例)
enum Num {One,Two,Three,
}fn value_in_cents(num: Num) -> u8 {// 依次匹配match num {Num::One => {println!("match One");1},Num::Two => 2,Num::Three => 3,}
}fn main() {let num = Num::One;println!("{}", value_in_cents(num))
}
  • 绑定值的模式:匹配的分支可以绑定到被匹配对象的部份值,可以从 enum 变体中提取值

#[derive(Debug)]
enum Name {Tim,Hope,
}
enum Num {One,Two,Three(Name),
}fn value_in_cents(num: Num) -> u8 {// 依次匹配match num {Num::One => {println!("match One");1},Num::Two => 2,Num::Three(name) => {println!("three name is: {:#?}", name);//three name is: Hope3},}
}fn main() {let num = Num::Three(Name::Hope);println!("{}", value_in_cents(num)) // 3
}

匹配 Option

fn main() {let five = Some(5);let six = plus_one(five);let none = plus_one(None);// println!("{}, {}", six, none);
}fn plus_one(x: Option<i32>) -> Option<i32> {match x {None => None,Some(i) => Some(i+1),}
}
  • match 匹配必须穷举所有的可能性(会在编译时检查),如果不需要处理,可以使用通配符“_”替代:
fn main() {let v = 0u8;match v {1 => println!("one"),2 => println!("two"),_ => (),}
}

if let

  • 处理只关注一种匹配,而忽略其他匹配的情况
  • 更少的代码,更少的缩进,更少的模版代码
  • 但是放弃了穷举的可能
fn main() {let v = 0u8;match v {2 => println!("two"),_ => println!("other"),}// 等效于上面的逻辑if let 2 = v {println!("two");} else {println!("other");}
}

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

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

相关文章

Linux-安装VMware-01

一、认识linux Linux 是一个开源的类 Unix 操作系统&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。Linux 是许多计算机硬件的底层操作系统&#xff0c;特别是服务器、嵌入式系统和个人电脑。它支持多种架构&#xff0c;包括 x86、x64、A…

算法学习笔记(8.8)-多重背包

目录 Question: 思路解析&#xff1a; 代码示例 多重背包的优化问题&#xff1a; 1.二进制优化 代码示例&#xff1a; 2.单调队列优化(滑动窗口) 代码示例 Question: 4. 多重背包问题 I - AcWing题库https://www.acwing.com/problem/content/description/4/ 多重背包简单来说其…

eqmx上读取数据处理以后添加到数据库中

目录 定义一些静态变量 定时器事件的处理器 订阅数据的执行器 处理json格式数据和将处理好的数据添加到数据库中 要求和最终效果 总结一下 定义一些静态变量 // 在这里都定义成全局的 一般都定义成静态的private static MqttClient mqttClient; // mqtt客户端 private s…

springboo 整合 redis

springBoot 整合 redis starter启动依赖。—包含自动装配类—完成相应的装配功能。 引入依赖 <!--引入了redis整合springboot 的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…

Ubuntu22.04安装Go语言的几种方式

在 Ubuntu 22.04 上安装 Go 语言可以通过几种不同的方法&#xff0c;以下是两种常见的安装方法&#xff1a; 方法1&#xff1a;使用 go 官方安装脚本 打开终端。 下载 Go 语言的安装脚本&#xff1a; curl -O https://go.dev/dl/go1.22.5.linux-amd64.tar.gz请检查 Go 官方网…

基于opencv[python]的人脸检测

1 图片爬虫 这里的代码转载自&#xff1a;http://t.csdnimg.cn/T4R4F # 获取图片数据 import os.path import fake_useragent import requests from lxml import etree# UA伪装 head {"User-Agent": fake_useragent.UserAgent().random}pic_name 0 def request_pic…

EXT4 数据结构

高级数据结构设计 Blocks EXT4 以块为单位分配存储空间。块是一组扇区介于 1KiB 和 64KiB 之间,扇区数量必须为 2 的整数幂。块又被分组成更大的单元,称为块组。默认情况下,文件系统可以包含 2^32 个块,启用 64 bits feature,则文件系统可以有 2^64 个块。 Layout 标准…

谷粒商城实战笔记-65-商品服务-API-品牌管理-表单校验自定义校验器

文章目录 1&#xff0c;el-form品牌logo图片自定义显示2&#xff0c;重新导入和注册element-ui组件3&#xff0c;修改brand-add-or-update.vue控件的表单校验规则firstLetter 校验规则sort 校验规则 1&#xff0c;el-form品牌logo图片自定义显示 为了在品牌列表中自定义显示品…

Typora 以 Github 作为图床使用 PicGo 上传图片

本文简练快速介绍如标题所述的操作流程 文章目录 1.前言1.1 图床简述1.2 Github图床的优缺点1.2.1 优点1.2.2 缺点 2.下载PicGo3.Github访问加速4.用github创建图床服务器4.1 注册4.2 创建仓库 4.3 生成TOKEN令牌5.设置PicGo6.设置Typora7.完成 1.前言 1.1 图床简述 图床&…

人工智能背后的图灵测试(TuringTest)是什么?

人工智能背后的图灵测试(TuringTest)是什么&#xff1f; 一、什么是图灵测试 图灵测试&#xff08;Turing Test&#xff09;由英国数学家和计算机科学家阿兰图灵&#xff08;Alan Turing&#xff09;在1950年提出&#xff0c;用以判断机器是否具有人类智能。图灵在其论文《计…

SNIFFER:用于可解释性的虚假信息检测的多模态大语言模型

S NIFFER : Multimodal Large Language Model for Explainable Out-of-Context Misinformation Detection 论文地址: https://openaccess.thecvf.com/content/CVPR2024/papers/Qi_SNIFFER_Multimodal_Large_Language_Model_for_Explainable_Out-of-Context_Misinformation_D…

3.1、数据结构-线性表

数据结构 数据结构线性结构线性表顺序存储和链式存储区别单链表的插入和删除练习题 栈和队列练习题 串&#xff08;了解&#xff09; 数据结构 数据结构该章节非常重要&#xff0c;上午每年都会考10-12分选择题下午一个大题 什么叫数据结构&#xff1f;我们首先来理解一下什…

【Android】碎片—动态添加、创建Fragment生命周期、通信

简单用法 在一个活动中添加两个碎片&#xff0c;并让这两个碎片平分活动空间 先新建一个左侧碎片布局和一个右侧碎片布局 左侧碎片 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/…

Unity Android接入SDK 遇到的问题

1. buildtools、platformtools、commandline tools 以及compiled sdk version、buildtools sdk version、target sdk version 的说明 Android targetSdkVersion了解一下 - 简书 2. 查看.class 和.jar文件 jd_gui 官网地址&#xff1a; 下载jd_gui 工具 &#xff0c;或者 idea 下…

ITK-均值滤波

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 均值滤波原理 均值滤波是一种常用的图像平滑技术&#xff0c;用于减少图像中的噪声。其基本原理是通过计算图像中每个像素及其邻…

linux ftp操作记录

一.ftp 创建用户 passwd: user ftpuser does not exist 如果你遇到 passwd: user ftpuser does not exist 的错误&#xff0c;这意味着系统中不存在名为 ftpuser 的用户。你需要首先确认FTP用户是否是系统用户&#xff0c;还是FTP服务器软件&#xff08;如Pure-FTPd&#xff…

【React】通过实际示例详解评论列表渲染和删除

文章目录 一、引言二、初始状态与状态更新1. 使用useState钩子管理状态2. 评论列表的初始数据 三、列表渲染的实现1. list.map(item > { ... })2. return 语句3. JSX 语法4. 为什么这样设计5. 完整解读 四、列表项的唯一标识1. key 的作用2. key 的用法3. 可以没有 key 吗&a…

【Stable Diffusion】(基础篇五)—— 使用SD提升分辨率

使用SD提升分辨率 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 在前期作画的…

c++ 构造函数与析构函数

本文参考菜鸟教程&#xff0c;仅作笔记用。 构造函数 构造函数&#xff08;Constructor&#xff09;是一种特殊的方法&#xff0c;用于在创建对象时进行初始化操作。构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。在面…

Pytorch使用教学4-张量的索引

1 张量的符号索引 张量也是有序序列&#xff0c;我们可以根据每个元素在系统内的顺序位置&#xff0c;来找出特定的元素&#xff0c;也就是索引。 1.1 一维张量的索引 一维张量由零维张量构成 一维张量索引与Python中的索引一样是是从左到右&#xff0c;从0开始的&#xff…