rust学习笔记8-枚举与模式匹配

embedded/2025/3/3 22:11:43/

在 Rust 中,枚举(Enum) 是一种定义一组命名值的数据类型。它允许你创建一个可以表示多个不同值的类型,这些值被称为“变体(variants)”。枚举是 Rust 中非常强大的特性之一,广泛用于模式匹配和错误处理。

1.声明一个枚举类型

rust">#[derive(Debug)]
enum Direction {Up,         //上Down,       //下Left,       //左Right,      //右UpLeft,     // 左上UpRight,    // 右上DownLeft,   // 左下DownRight,  // 右下
}

2. 模式匹配match 语法
枚举的目的是对某一类事物的分类,分类的目的是为了对不同的情况进行描述。基于这个原理,往往枚举类最终都会被分支结构处理(许多语言中的 switch )。 switch 语法很经典,但在 Rust 中并不支持,很多语言摒弃 switch 的原因都是因为 switch 容易存在因忘记添加 break 而产生的串接运行问题,Java 和 C# 这类语言通过安全检查杜绝这种情况出现。

Rust 通过 match 语句来实现分支结构。

rust">#[derive(Debug)]
enum Direction {Up,         //上Down,       //下Left,       //左Right,      //右UpLeft,     // 左上UpRight,    // 右上DownLeft,   // 左下DownRight,  // 右下
}fn main() {let direction = Direction::UpRight;match direction {Direction::Up => println!("向上移动"),Direction::Down => println!("向下移动"),Direction::Left => println!("向左移动"),Direction::Right => println!("向右移动"),Direction::UpLeft => println!("向左上移动"),Direction::UpRight => println!("向右上移动"),Direction::DownLeft => println!("向左下移动"),Direction::DownRight => println!("向右下移动"),}
}

运行结果

3.枚举应用主要用于Option 类型和Result 类型
Option枚举类型
Option 是 Rust 标准库中的枚举类型,用于填补 Rust 不支持 null 引用的空白。
许多语言支持 null 的存在(C/C++、Java),这样很方便,但也制造了极大的问题,null 的发明者也承认这一点,"一个方便的想法造成累计 10 亿美元的损失"。
null 经常在开发者把一切都当作不是 null 的时候给予程序致命一击:毕竟只要出现一个这样的错误,程序的运行就要彻底终止。
为了解决这个问题,很多语言默认不允许 null,但在语言层面支持 null 的出现(常在类型前面用 ? 符号修饰)。
Java 默认支持 null,但可以通过 @NotNull 注解限制出现 null,这是一种应付的办法。
Rust 在语言层面彻底不允许空值 null 的存在,但无奈null 可以高效地解决少量的问题,所以 Rust 引入了 Option 枚举类型:

rust">enum Option<T> {Some(T),None,
}

具体用法

rust">fn is_null<T: std::fmt::Debug>(opt: Option<T>) {match opt {Some(something) => {println!("{:?}", something);},None => {println!("opt is nothing");}}
}fn main() {let opt: Option<String> = Option::None;is_null(opt);let opt2 = Option::Some("hello");is_null(opt2);
}

Result 枚举类型
Result 是另一个常用的枚举类型,用于表示操作的成功或失败。Ok(T) 表示成功,Err(E) 表示失败。

rust">enum Result<T, E> {Ok(T),Err(E),
}

具体用法

rust">fn main() {println!("请输入一个整数:");let mut input = String::new();std::io::stdin().read_line(&mut input).expect("读取输入失败");let n: i32 = match input.trim().parse() {Ok(num) => num,Err(_) => {println!("无效的输入,请输入一个整数!");return;}};if n < 0 {println!("n是负数");}else {println!("n不9是负数");}
}

总结一下,Rust的枚举类型非常灵活,能够表示多种不同的情况,每个变体可以携带不同类型和数量的数据。通过模式匹配来处理不同的情况,确保所有可能性都被覆盖。Option和Result是标准库中常用的枚举,用于处理可能缺失的值和错误情况。枚举的方法可以通过impl块定义,使得枚举具有面向对象的一些特性。此外,Rust编译器对枚举的内存布局进行优化,使得枚举在空间上尽可能高效。


http://www.ppmy.cn/embedded/169725.html

相关文章

什么是RabbitMQ

什么是RabbitMQ 1.RabbitMQ介绍 RabbitMQ 是一个开源的消息队列中间件&#xff0c;实现了 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09; 协议。它用于在分布式系统中传递消息&#xff0c;支持异步通信、解耦、负载均衡和消息持久化等功能。RabbitMQ 以其高…

AWS API Gateway灰度验证实现

在微服务架构中,灰度发布(金丝雀发布)是验证新版本稳定性的核心手段。通过将小部分流量(如 10%)导向新版本服务,可以在不影响整体系统的情况下快速发现问题。AWS API Gateway 原生支持流量按比例分配功能,无需复杂编码即可实现灰度验证。本文将详细解析其实现方法、最佳…

数据结构:树的概念

树的概念&#xff1a;树是 n n n个结点的有限集合&#xff0c;有且仅有一个被称为根的结点。当 n > 1 n > 1 n>1时&#xff0c;其余结点可分为互不相交的有限集合&#xff0c;其中每个集合本身又是一颗树。 树的属性&#xff1a; 结点层次&#xff08;深度&#xff…

【Vue3】浅谈setup语法糖

Vue3 的 setup 语法糖是通过 <script setup> 标签启用的特性&#xff0c;它是对 Composition API 的进一步封装&#xff0c;旨在简化组件的声明式写法&#xff0c;同时保留 Composition API 的逻辑组织能力。以下是其核心概念和原理分析&#xff1a; 一、<script setu…

C++奇迹之旅:C++的单例模式

文章目录 &#x1f4dd; 一、单例模式的核心原则二、基础实现&#xff08;懒汉式&#xff0c;线程不安全&#xff09;问题&#xff1a; 三、线程安全的懒汉式&#xff08;双重检查锁定&#xff09;特点&#xff1a; 四、饿汉式&#xff08;线程安全&#xff09;特点&#xff1a…

Elasticsearch:使用阿里云 AI 服务进行嵌入和重新排名

作者&#xff1a;来自 Elastic Toms Mura 将阿里云 AI 服务功能与 Elastic 结合使用。 更多阅读&#xff0c;请参阅 “Elasticsearch&#xff1a;使用阿里 infererence API 及 semantic text 进行向量搜索”。 在本文中&#xff0c;我们将介绍如何将阿里云 AI 功能与 Elastics…

江协科技/江科大-51单片机入门教程——P[1-3] 单片机及开发板介绍

前言&#xff1a;本节主要的任务是了解一下 51 单片机和所用的普中51开发板。 目录 一、单片机介绍 二、单片机的应用领域 三、STC89C52单片机 四、命名规则 五、单片机内部拆解 六、单片机内部结构图 七、单片机管脚图 八、单片机最小系统 九、开发板介绍 十、开发…

DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…