Rust 数据类型 之 类C枚举 c-like enum

目录

枚举类型 enum

定义和声明

例1:Color 枚举

例2:Direction 枚举

例3:Weekday 枚举

类C枚举 C-like

打印输出

强制转成整数

例1:Weekday 枚举

例2:HttpStatus 枚举

例3:Color 枚举

模式匹配

match 表达式

枚举方法


枚举类型 enum

枚举类型是一种用于表示一组有限数量相互关联的离散型数据,这些值可以是不同的整数、字符串或其他类型的对象。枚举体内的元素称作“成员”,rust语言中,枚举里面的成员,都可以被看作是结构体,当然枚举还能嵌套另一个枚举。

定义和声明

在Rust中,枚举类型可以通过关键字enum来定义:

enum MyEnum {Variant1,Variant2,Variant3,//...VariantN,
}

enum是enumerate/enumeration的缩略词,MyEnum为自定义的枚举名

Variant即变量的意思,有的译作“变体”,我觉得还是沿用C/C++语言中的称呼“成员”比较恰当。

Variant数量N一定有限的,太多的变量堆砌没有意义;而且N>=2,无成员或单个成员也无意义。

通过使用枚举类型,可以为不同的情况定义一组有限的取值。这在需要表示多个可能状态或选项的情况下非常有用。以下是几个常见的枚举类型经典实例:

例1:Color 枚举

Color 枚举表示颜色的不同可能取值,比如红色、绿色和蓝色。

enum Color {Red,Green,Blue,
}

例2:Direction 枚举

Direction 枚举表示方向的不同可能取值,比如上、下、左和右。

enum Direction {Up,Down,Left,Right,
}

例3:Weekday 枚举

Weekday 枚举表示一周中的不同天,比如一周7天的枚举。

enum Weekday {Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,    
}

类C枚举 C-like

与C/C++语言中的枚举成员只允许是usigned int型常量,也称枚举常量。Rust中具有C风格的枚举,那么必须满足枚举里面的成员都是单元结构体

打印输出

使用#[derive(Debug)]简化输出,格式:println!("{:?}", MyEnum::VariantN); 

#[derive(Debug)]
enum Number {Zero,One,Two,Three,
}fn main() {println!("zero is {:?}", Number::Zero);println!("one is {:?}", Number::One);println!("Two is {:?}", Number::Two);println!("Three is {:?}", Number::Three);
}

输出:

zero is Zero
one is One
Two is Two
Three is Three

强制转成整数

不使用#[derive(Debug)],强制转化为整数后输出

enum Number {Zero,One,Two,Three,
}fn main() {println!("zero is {}", Number::Zero as i32);println!("one is {}", Number::One as i32);println!("Two is {}", Number::Two as i32);println!("Three is {}", Number::Three as i32);
}

输出:

zero is 0
one is 1
Two is 2
Three is 3

类C枚举也可以通过赋值运算,变成一组离散的整数:

#![allow(dead_code)]#[derive(Debug)]
enum Number {Zero,One,Two,Five = 5,Six,
}fn main() {println!("zero is {}", Number::Zero as i32);println!("one is {}", Number::One as i32);println!("Five is {}", Number::Five as i32);println!("Six is {}", Number::Six as i32);
}

输出:

0
1
5

注:在整个程序中枚举成员Two没被调用过,可以用#![allow(dead_code)]来滤去警告。没有此行,上述程序在编译执行能输出结果,但同时警告:warning: variant `Two` is never constructed。

例1:Weekday 枚举

Weekday 枚举通过赋值,使得星期一到星期日对应整数1~7;而非默认的星期日到星期六对应整数0~6。

#![allow(dead_code)]enum Weekday {Sunday = 7,Monday = 1,Tuesday,Wednesday,Thursday,Friday,Saturday,
}fn main() {println!("Sunday is {}", Weekday::Sunday as i32);println!("Tuesday is {}", Weekday::Tuesday as i32);println!("Saturday is {}", Weekday::Saturday as i32);
}

输出:

Sunday is 7
Tuesday is 2
Saturday is 6 

例2:HttpStatus 枚举

HttpStatus 枚举表示不同的 HTTP 状态码,比如200表示成功,404表示找不到页面,500表示服务器内部错误等,共有近百个成员,列举部分如下:

#![allow(dead_code)]enum HttpStatus {Continue = 100, //"CONTINUE" 继续SwitchingProtocols, //"SWITCHING_PROTOCOLS" 切换协议Processing, //"PROCESSING" 执行Checkpoint, //"CHECKPOINT" 检查点OK = 200, //"OK" OKCREATED, //"Created" 创建ACCEPTED, //"Accepted" 接受NonAuthoritativeInformation, //"NON_AUTHORITATIVE_INFORMATION" 非权威信息NoContent, //"NO_CONTENT" 没有内容ResetContent, //"RESET_CONTENT" 重置内容PartialContent, //"PARTIAL_CONTENT" 部分内容MultiStatus, //"MULTI_STATUS" 多个状态AlreadyReported, //"ALREADY_REPORTED" 已发IMUsed = 226, //"IM_USED" 已过时MultipleChoices = 300, //"MULTIPLE_CHOICES" 多选择MovedPermanently, //"MOVED_PERMANENTLY" 永久移动FOUND, //"Found" 找到MovedTemporarily, //"MOVED_TEMPORARILY"SeeOther, //"SEE_OTHER" 参见其它NotModified, //"NOT_MODIFIED" 未修改UseProxy, //"USE_PROXY"),TemporaryRedirect, //"TEMPORARY_REDIRECT" 暂时重定向PermanentRedirect, //"PERMANENT_REDIRECT" 永久重定向//......BadRequest = 400, //"BAD_REQUEST" 错误请求Unauthorized, //"UNAUTHORIZED" 未经授权PaymentRequired, //"PAYMENT_REQUIRED" 付费请求Forbidden, //"FORBIDDEN" 禁止NotFound, //"NOT_FOUND" 未找到MethodNotAllowed, //"METHOD_NOT_ALLOWED" 方法不容许NotAcceptable, //"NOT_ACCEPTABLE" 方法不接受//......InternalServerError = 500, // "INTERNAL_SERVER_ERROR" 服务器遇到了意料不到的情况,不能完成客户的请求NotImplemented, //"NOT_IMPLEMENTED"  服务器不支持实现请求所需要的功能BadGateway, //"BAD_GATEWAY" 从上游服务器接收到无效的响应ServiceUnavailable, //"SERVICE_UNAVAILABLE" 服务不可用GatewayTimeout, //"GATEWAY_TIMEOUT") 网关不能及时地从远程服务器获得应答//......
}fn main() {println!("OK is {}", HttpStatus::OK as i32);println!("Bad Request is {}", HttpStatus::BadRequest as i32);
}

输出:

OK is 200
Bad Request is 400

例3:Color 枚举

用{:06x}格式输出6位16进制数表示的颜色

enum Color {Red = 0xff0000,Green = 0x00ff00,Blue = 0x0000ff,
}fn main() {println!("roses are #{:06x}", Color::Red as i32);println!("leaves are #{:06x}", Color::Green as i32);println!("violets are #{:06x}", Color::Blue as i32);println!("red is {}", Color::Red as i32);println!("green is {}", Color::Green as i32);println!("blue is {}", Color::Blue as i32);
}

输出:

roses are #ff0000
leaves are #00ff00
violets are #0000ff
red is 16711680
green is 65280
blue is 255 

模式匹配

枚举类型在 Rust 中经常与模式匹配(pattern matching)结合使用,以根据枚举类型的值执行不同的操作。

match 表达式

match 表达式可以用于对枚举变体进行模式匹配,并根据所匹配的变体执行相应的代码块。它的语法如下:

match value {pattern1 => {// 如果 value 匹配了 pattern1},pattern2 => {// 如果 value 匹配了 pattern2},// 其他模式...
}

如定义一个名为 Color 的枚举类型,其中包含了三个成员:Red、Green 和 Blue。每个成员都是一个合法的标识符,用于表示不同的颜色。

enum Color {Red,Green,Blue,
}

对上述的 Color 枚举类型,可以使用模式匹配来执行相应的操作:

fn print_color(color: Color) {match color {Color::Red => println!("The color is Red"),Color::Green => println!("The color is Green"),Color::Blue => println!("The color is Blue"),}
}

上述示例中,函数 print_color 接收一个 Color 类型的参数,并使用 match 进行模式匹配。根据传入的颜色值,会执行相应的操作。

枚举方法

还可以自定义方法,为每个成员定义相应的值。

#![allow(dead_code)]enum Color {Red,Green,Blue,Yellow,Magenta,Cyan,
}impl Color {fn to_rgb(&self) -> (u8, u8, u8) {match self {Color::Red => (255, 0, 0),Color::Green => (0, 255, 0),Color::Blue => (0, 0, 255),Color::Yellow => (255, 255, 0),Color::Magenta => (255, 0, 255),Color::Cyan => (0, 255, 255),}}
}fn main() {let red = Color::Red;let red_rgb = red.to_rgb();println!("RGB value of red: {:?}", red_rgb);let yellow = Color::Yellow;let yellow_rgb = yellow.to_rgb();println!("RGB value of yellow: {:?}", yellow_rgb);
}

在上述示例中,我们为 Color 枚举类型实现了一个 to_rgb 方法,用于将颜色转换为 RGB 值。

总结起来,Rust 的枚举类型提供了强大的模式匹配功能,使得枚举类型非常灵活和可靠,适用于各种场景和数据处理需求。本文只初步学习类C风格的枚举类型,其它分类且听下回分解。

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

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

相关文章

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析

一、 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 二、 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与注记 …

Kubernetes集群故障排查—审计

Kubernetes 审计(Auditing) 功能提供了与安全相关的、按时间顺序排列的记录集, 记录每个用户、使用 Kubernetes API 的应用以及控制面自身引发的活动。 审计功能使得集群管理员能够回答以下问题: 发生了什么?什么时候…

算法竞赛备赛之经典数据结构训练提升,暑期集训营培训

1.链表与邻接表:树与图的存储 我们将结构体和指针结合来实现链表 struct Node {int val;Node * next; }; ​ new Node;//这样创建结点是相当慢的 我们算法主要是用数组来模拟链表,这样效率会高一些。 数组模拟单链表 邻接表:存储图和树 实…

(css)自定义el-dialog对话框添加背景图片

(css)自定义el-dialog对话框添加背景图片 效果: // 文件管理对话框 /deep/ .el-dialog {background: transparent;background-image: url("../assets/image/file-upload-background.png");background-size: 100% 100%; } // 头部 /deep/ .el-dialog__titl…

Nginx 301重定向分析

参考; 404 - 墨天轮 深度硬核文:Nginx的301重定向处理过程分析 - 知乎 Nginx的301状态码处理逻辑设计 HTTP协议中3xx开头的状态响应码都是表示重定向的响应。根据RFC的定义: 301 Moved Permanently 302 Found 303 See Other 307 Temporary Redirect 301是永…

Day 63 : 集成学习之 AdaBoosting (1. 带权数据集)

63.1 AdaBoosting基本算法:先从初始训练集训练一个弱学习器,在根据弱学习器的表现对训练样本进行权重调整,经过若干轮之后,将得到一组分类器,将数据输入这组分类器后会得到一个综合且准确的的分类结果。“三个臭皮匠&a…

C++ 单例模式(介绍+实现)

文章目录 一. 设计模式二. 单例模式三. 饿汉模式四. 懒汉模式结束语 一. 设计模式 单例模式是一种设计模式 设计模式(Design Pattern)是一套被反复使用,多数人知晓的,经过分类的,代码设计经验的总结。 为什么要有设计模式 就像人类历史发展会…

WEB:wife_wife

背景知识 JavaScript原型链污染 题目 先尝试一下,注册了管理员账号 这里不知道邀请码,所以没有勾选 答案不正确 这里借鉴其他大佬的思路 查看源代码才知道,后端没有数据库,所以sql注入是不可能的 // post请求的路径 app.pos…

【网络】应用层——协议定制 | 序列化和反序列化 | 初识http

🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 在前面本喵已经带大家见识过了scoket网络通信的样子,现在开始深入学习网络的原理&#xff…

机器学习 day29(高偏差、高方差,参数d对模型的影响)

1. 高偏差、高方差、拟合能力、泛化能力 偏差和方差分别代表拟合能力和泛化能力若给左图数据集拟合一阶多项式(d取1),则该模型有很高的偏差(欠拟合)。因为它对训练集和验证集的表现均不好,所以Jtrain很高…

快手内推(2024校招,社招)

校招 校招可以直接投递,如果想投递指定部门或岗位的可以私聊我。可以帮看简历和面试状态,加快推进。 内推码:vlxMTFNBS 专属内推链接:https://campus.kuaishou.cn/#/campus/jobs?codevlxMTFNBS 社招 社招内推私聊,可…

[Java]详解什么是注解以及如何自定义注解?

文章目录 一、什么是注解(1).注解的作用(2).注解的格式(3).注解在哪里使用 二、注解的类型(1).内置注解(2).元注解(3).自定义注解 三、自定义注解实现及测试结果: 一、什么是注解 (1).注解的作用 ①:注解一般用于对程序的说明,就像注释一样…

windows系统修改mysql8配置文件,关闭ssl验证

如何寻找配置文件 我的电脑,右键,管理,服务 找到MySQL8 右键,属性 找到配置文件位置 通常情况下的默认路径是: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini 如何关闭SSL验证 打开 my.ini 配置内容如下&#x…

【100天精通python】Day7:数据结构_列表 List的创建、删除、访问、遍历、统计、排序、推导等使用

目录 1 列表的创建 2 列表的删除 3 访问列表元素 4 遍历列表 5 添加修改删除列表元素 6 对列表进行统计和计算 7 对列表进行排序 8 列表推导式 9 多维列表 在Python中,列表是一种有序的可变数据类型,用于存储一组元素。 列表使用方括号“[] ”来…

Qt5.14.2下载及安装

1. 下载 https://download.qt.io/archive/qt/5.14/5.14.2/ 由于Qt 自从5.15版本开始,对非商业版本(也就是开源版本),不提供已经制作好的离线exe安装包。所以,对于5.15(含)之后的版本&#xff…

Idea 设置类和方法的注释(获取参数)

Idea 添加注释:类注释、方法注释 类注释 方法注释 类注释 File–Setting–Editor–File and Code Templates–Class: 注释模板: /** **description: *author: fqtang*time: ${DATE} ${TIME}* */ 操作截图: 效果: 方法注释 为了…

图数据库Neo4j学习二——cypher基本语法

1命名规范 名称应以字母字符开头,不以数字开头,名称不应包含符号,下划线除外可以很长,最多65535( 2^16 - 1) 或65534字符,具体取决于 Neo4j 的版本名称区分大小写。:PERSON和:Person是:person三个不同的标签&#xff…

Jmeter+Jenkins+Ant自动化持续集成环境搭建

一、安装准备 1.JDK:jdk-8u121-windows-x64 2.jmeter工具:apache-jmeter-2.13 3.ANT工具:apache-ant-1.9.7-bin 4.jenkins工具:jenkins-2.32.2 二、软件安装 1.JDK的安装 >双击JDK安装包,选择安装路径(本人是…

详细总结Webpack5的配置和使用

打包工具 使用框架(React、Vue),ES6 模块化语法,Less/Sass 等 CSS预处理器等语法进行开发的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、CSS 等语法,才能运行。 所以需要打包工具帮我们做完这些事。除此之…

3、C# 方法构成

上一节,我们讲述了程序的基本构成。由大到小分别为”解决方案-->项目-->类-->方法“。 这一节,我们讲讲方法。 方法可以说是程序的基本构成单位。假如把方法抽象成点的话,我们可以认为程序是一个树状的结构。树根,就是我们的起点方法,也叫主方法。这一点,基本…