【Rust自学】6.1. 定义枚举

news2024/12/27 9:55:20

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

6.1.1. 什么是枚举

枚举允许我们列举所有可能的值来定义一个类型。这与其他编程语言中的枚举类似,但 Rust 的枚举更加灵活和强大,因为它们可以关联数据和方法,类似于其他语言中的类或结构体。

6.1.2. 定义枚举

举个例子,比如说IP地址无非就只有2种——IPv4和IPv6,要么是IPv4要么是IPv6,这种情况就非常适合使用枚举类型,因为枚举的值也只能是它所有变体(枚举所有可能的值)里的一个。

enum IpAddrKind{
	V4,
	V6,
}

这个代码使用enum关键字声明了一个叫IpAddrkind的枚举类型,它有两个类型——一个是V4,一个是V6,分别代表IPv4和IPv6。

6.1.3. 枚举值

表示(创建)枚举值非常简单,格式为枚举类型的名字::变体,例如:

let four = IpAddrKind::V4;
let six = IpAddrKind::V6;

枚举的变体都在其标识符所在的空间下,它的标识符就是这个枚举类型的名。

我们可以声明一个函数,它接收IpAddrKind这个类型作为它的参数,而传递的值就即可以是V4也可以是V6

fn route(ip_addr: IpAddrKind) {  
    match ip_addr {  
        IpAddrKind::V4 => println!("IPv4"),  
        IpAddrKind::V6 => println!("IPv6"),  
    }  
}

让我们试试效果:
整体代码:

enum IpAddrKind{  
    V4,  
    V6,  
}  
  
fn main() {  
    let four = IpAddrKind::V4;  
    let six = IpAddrKind::V6;
    // 调用函数  
    route(four);  
    route(six);  
    route(IpAddrKind::V4);  
}  
  
fn route(ip_addr: IpAddrKind) {  
    match ip_addr {  
        IpAddrKind::V4 => println!("IPv4"),  
        IpAddrKind::V6 => println!("IPv6"),  
    }  
}

输出:

IPv4
IPv6
IPv4

6.1.3. 将数据附加到枚举的变体中

枚举类型是一种自定义的数据类型,所以它可以作为结构体里面字段的类型,例如:

struct IpAddr {  
    kind: IpAddrKind,  
    address: String,  
}

IpAddr下的Kind的类型是IpAddrKind,存储网络协议;它的另一个字段address是字符串类型,存储具体的IP地址。

通过这样的结构体,我们可以在main()函数中声明一些存储IPv4、IPv6信息的变量:

fn main() {  
    let home = IpAddr {  
        kind: IpAddrKind::V4,  
        address: String::from("127.0.0.1"),  
    };  
    let loopback = IpAddr {  
        kind: IpAddrKind::V6,  
        address: String::from("::1"),  
    };  
}

Rust允许数据直接附加到枚举的变体中,例如:

enum IpAddr {
	V4(String),
	V6(String),
}

在每个变体的后边加上一个类型(不一定都是同一个类型)。例如这里V4V6这两个变体后都跟了String类型。

这种做法的优点是:

  • 不需要额外使用struct
  • 每个变体可以拥有不同的类型以及相关联的数据量

比如说:

enum IpAddr {
	V4(u8, u8, u8, u8),
	V6(String),
}

IPv4实际上是由4个32位的数字(也就是u8的容量)组成的,而IPv6是字符串,所以就应该使用String。如果我们想要将V4地址存储为四个u8值,但仍将V6地址表示为一个String值,我们将无法使用结构体。枚举可以轻松处理这种情况。

我们来重写一下6.1.3中的代码:

enum IpAddrKind{  
    V4(u8, u8, u8, u8),  
    V6(String),  
}  
  
fn main() {  
    let home = IpAddrKind::V4(127, 0, 0, 1);  
    let loopback = IpAddrKind::V6(String::from("::1"));  
}

确实比前文的代码少多了。

6.1.4. 标准库中的IpAddr

事实上,标准库中就提供了关于IP地址的枚举类型,看一下官方是怎么写的

struct Ipv4Addr {
    // --snip--
}

struct Ipv6Addr {
    // --snip--
}

enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}

Ipv4AddrIpv6Addr的内容这里没有写出来,但这不是重点。重点是此代码说明任何类型的数据放入枚举变体中都是可以的:例如字符串、数字类型或结构。甚至可以包含另一个枚举。

6.1.5. 在枚举类型使用方法(Method)

方法(Method)的概念在上一个文章中就有涉及,这里不过多阐述。定义方法使用impl关键字,如下例:

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}
impl Message {
    fn call(&self) {
        println!("Something happens");
    }
}
fn main(){
	let m = Message::Write(String::from("hello"));
    m.call();
}

该枚举有四种不同类型的变体:

  • Quit:没有关联任何数据。
  • Move:包含了一个匿名的结构体。
  • Write:包含一个String
  • ChangeColor:包括三个i32值。

在主函数里声明了变量mMessage这个枚举类型下的Write变体,并且附带了String类型的hello。然后又在m上使用了方法call,就会打印Something happens

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

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

相关文章

少儿编程在线培训系统:客户服务与学习支持

2.1 VUE技术 VUE它是由HTML代码,配上嵌入在HTML代码里面的Java代码组成的应用于服务器端的语言,使用VUE进行开发能够更加容易区分网页逻辑以及网页设计内容,让程序员开发思路更加清晰化,VUE在设计组件时,它是可以重用的…

流批一体向量化计算引擎 Flex 在蚂蚁的探索和实践

编者按:Flex是蚂蚁数据部自研的一款流批一体的向量化引擎,Flex是Fink和Velox的全称,也是Flexible的前缀,被赋予了灵活可插拔的寓意。本文将重点从向量化技术背景、Flex架构方案和未来规划三个方面展开论述。 作者介绍:…

upload-labs关卡记录11

先上传一个一句话木马试试,居然可以上传成功,复制图片链接,在另一个窗口打开: 会发现,我们明明上传的是shell.php,但是这里就是没有了php,这样我们在执行我们相关的语句的时候就无法执行了: 就…

WebRTC服务质量(08)- 重传机制(05) RTX机制

WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…

借助 obdiag,让 OceanBase 参数和变量的对比更简单

本文将介绍 obdiag 工具中参数对比和变量对比功能的适用场景和试用方法。​​​​​​​ obdiag 参数和变量对比功能的适用场景 参数对比功能适用场景 不同observer对于同一参数允许配置不同的值,实际生产环境中,用户可能因多种原因在不同observer上为同…

Net9解决Spire.Pdf替换文字后,文件格式乱掉解决方法

官方文档 https://www.e-iceblue.com/Tutorials/Spire.PDF/Program-Guide/Text/Find-and-replace-text-on-PDF-document-in-C.html C# 在 PDF 中查找替换文本 原文件如下图,替换第一行的新编码,把41230441044替换为41230441000 替换代码如下&#xff…

VBA技术资料MF246:将工作表中形状复制到WORD文档

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

一次医院RIS系统的升级

2020-03-11 目录 数据库升级... 1 数据结构升级... 1 系统配置... 2 WEB服务器准备... 3 启动ASP.NET State Service服务... 3 检查IIS. 4 发布站点... 4 添加应用程序池... 4 发布网站... 5 处理打印模板... 6 web.config的配置... 6 处理图片文件目录... 6 修改W…

显示 Windows 任务栏

显示 Windows 任务栏 1. 取消勾选自动隐藏任务栏2. 重启 Windows 资源管理器References 1. 取消勾选自动隐藏任务栏 Windows 任务栏具有自动隐藏功能,不使用时自动隐藏,使用时显示。 鼠标右键单击桌面上的空白区域,个性化 -> 任务栏。不…

【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体

版本:Unity2019.4.0f1 PackageManager下载Burst插件(1.2.3版本) 利用如下代码,生成一个Texture3D资源,它只能脚本生成,是一个32*32*32的立方体,导出路径记得改下,不然报错。 using UnityEditor; using Uni…

轻量级安全云存储方案Hoodik

什么是 Hoodik ? Hoodik 是一款轻量级、安全且自托管的云存储解决方案。它采用 Rust 和 Vue 设计和构建,专注于端到端加密,保护您的数据免受窥探和黑客的侵害。Hoodik 支持文件上传和下载,让您可以轻松地与其他用户共享文件。简单…

[WASAPI]音频API:从Qt MultipleMedia走到WASAPI,相似与不同

[WASAPI] 从Qt MultipleMedia 来看WASAPI 最近在学习有关Windows上的音频驱动相关的知识,在正式开始说WASAPI之前,我想先说一说Qt的Multiple Media,为什么呢?因为Qt的MultipleMedia实际上是WASAPI的一层封装,它在是线…

Linux 大文件管理与 Hugging Face 模型下载实践:解决磁盘空间与大文件传输的全攻略20241226

Linux 大文件管理与 Hugging Face 模型下载实践:解决磁盘空间与大文件传输的全攻略 引言 在 Linux 系统中管理大文件是一项常见但不容忽视的任务,尤其是在处理复杂场景时,比如磁盘空间不足、断点续传下载模型文件、管理日志文件等。通过实际…

TOGAF之架构标准规范-业务架构

TOGAF标准规范中,业务架构阶段的主要工作是开发支持架构愿景的业务架构。 如上所示,业务架构(Business Architecture)在TOGAF标准规范中处于B阶段,该阶段的主要内容包括阶段目标、阶段输入、流程步骤、架构方法。 阶段…

aPaaS是什么?有何特点?以及aPaaS核心优势有哪些?

​aPaaS是什么? aPaaS,Application Platform as aService,应用程序平台即服务。国际知名咨询机构 Gartner 对aPaaS所下的定义是:“这是基于PaaS(平台即服务)的一种解决方案,支持应用程序在云端的开发、部署和运行&…

【网络分析工具】WireShark的使用(超详细)

网络分析工具——WireShark的使用 简介WireShark软件安装Wireshark 开始抓包示例WireShark抓包界面WireShark 主要分为这几个界面TCP包的具体内容Wireshark过滤器设置wireshark过滤器表达式的规则Wireshark抓包分析TCP三次握手Wireshark分析常用操作 简介 WireShark是非常流…

前端js验证码插件

相关代码,在最上方的绑定资源

URDF文件中inertial数据的描述坐标系说明

这件事的来源是这样的:结构手动把连杆坐标系下描述的惯性张量数据写入了urdf中,给我到以后发现有问题,给我搞懵了,以为我错了这么多年,于是有了本次的深度调研,先上结论,感兴趣的可以参考后文。…

宠物行业的出路:在爱与陪伴中寻找增长新机遇

在当下的消费市场中,如果说有什么领域能够逆势而上,宠物行业无疑是一个亮点。当人们越来越注重生活品质和精神寄托时,宠物成为了许多人的重要伴侣。它们不仅仅是家庭的一员,更是情感的寄托和生活的调剂。然而,随着行业…

Web前端基础知识(三)

表单的应用非常丰富&#xff0c;可以说&#xff0c;每个网站都会用到表单。下面首先介绍表单中的form标签。 --------------------------------------------------------------------------------------------------------------------------------- <form></form&g…