Rust之枚举和模式匹配(一):枚举定义

【Rust】Rust中的枚举与模式匹配,原理解析与应用实战 枚举(enumerations),也被称作 enums。枚举允许你通过列举可能的值来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option ,它代表一个值要么是某个值,要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。 阅读详情

开发环境

  • Windows 10
  • Rust 1.58.1

 

  • VS Code 1.64.2 

 项目工程

这里继续沿用上次工程rust-demo

枚举和模式匹配

枚举允许您通过枚举类型的可能变体来定义类型。首先,我们将定义并使用一个枚举来展示一个枚举如何编码数据的含义。接下来,我们将探索一个特别有用的枚举,称为Option,它表示一个值可以是某个值,也可以是零。然后,我们将看看match表达式中的模式匹配是如何简化为枚举的不同值运行不同代码的。最后,我们将介绍if let构造如何成为另一种方便、简洁的习惯用法,让您在代码中处理枚举。

枚举是许多语言中的一个特性,但是它们的功能在每种语言中都有所不同。

定义枚举

让我们来看一个我们可能想要用代码表达的情况,看看为什么在这种情况下枚举是有用的并且比结构更合适。假设我们需要处理IP地址。目前,IP地址使用两种主要标准:第四版和第六版。这些是我们的程序将遇到的IP地址的唯一可能性:我们可以枚举所有可能的变体,这就是枚举的名称。

任何IP地址都可以是版本四或版本六地址,但不能同时是两者。IP地址的该属性使得enum数据结构是合适的,因为enum值只能是其变体之一。第四版和第六版地址基本上都是IP地址,所以当代码处理适用于任何类型IP地址的情况时,它们应该被视为相同的类型。

我们可以通过定义IpAddrKind枚举并列出IP地址的可能类型(V4和V6)来用代码表达这个概念。这些是枚举的变体,如下所示:

// 定义枚举
enum IpAddrKind {
    V4,
    V6,
}

IpAddrKind现在是一个自定义数据类型,我们可以在代码中的其他地方使用它。

枚举值

我们可以创建IpAddrKind的两种变体的实例,如下所示:

// 使用枚举的值   
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;

请注意,枚举的变体是在其标识符下命名的,我们使用一个双冒号来分隔两者。这很有用的原因是,现在值IpAddrKind::V4和IpAddrKind::V6属于同一类型:IpAddrKind。

例如,我们可以定义一个接受任何IpAddrKind的函数:

fn route(ip_kind: IpAddrKind) {}

我们可以用任何一个变量来调用这个函数:

// 调用
route(IpAddrKind::V4);
route(IpAddrKind::V6);

使用枚举有更多的优点。多想想我们的IP地址类型,目前我们没有办法存储实际的IP地址数据;我们只知道是哪一种。刚刚学习了前面的结构体,可以定义如下所示的代码解决一些问题。

// 枚举 
enum IpAddrKind {
    V4,
    V6,
}

// 结构体
struct IpAddr {
    kind: IpAddrKind,
    address: String,
}

// 结构体变量初始化
let home = IpAddr {
    kind: IpAddrKind::V4,
    address: String::from("127.0.0.1"),
};

let loopback = IpAddr {
    kind: IpAddrKind::V6,
    address: String::from("::1"),
};

这里,我们定义了一个结构体IpAddr,它有两个字段:一个是IpAddrKind类型的kind字段(我们之前定义的enum ),一个是String类型的address字段。我们有这个结构的两个实例。第一个是home,其类型的值为IpAddrKind::V4,关联的地址数据为127.0.0.1。第二个实例loopback使用IpAddrKind的另一个变体作为它的种类值V6,并有一个与之相关联的地址 ::1。我们已经使用了一个结构将kind和address值捆绑在一起,所以现在变量与值相关联。

通过将数据直接放入每个枚举变量中,我们可以用一种更简洁的方式表示相同的概念,只使用一个枚举,而不是一个结构中的枚举。IpAddr枚举的这个新定义表明,V4和V6变体都将具有关联的字符串值,如下所示:

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

let home = IpAddr::V4(String::from("127.0.0.1"));

let loopback = IpAddr::V6(String::from("::1"));

我们直接将数据附加到枚举的每个变量上,因此不需要额外的结构。这里也更容易看到枚举如何工作的另一个细节:我们定义的每个枚举变量的名称也成为构造枚举实例的函数。也就是说,IpAddr::V4()是一个接受string参数并返回IpAddr类型实例的函数调用。作为定义枚举的结果,我们自动得到这个构造函数。

使用enum而不是struct还有另一个好处:每个变量可以有不同类型和数量的关联数据。第四版类型IP地址将始终有四个数值部分,其值介于0和255之间。如果我们希望将V4地址存储为四个u8值,但仍然将V6地址表示为一个string值,我们将无法使用struct。枚举的方式如下:

// 定义枚举
enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

let home = IpAddr::V4(127, 0, 0, 1);

let loopback = IpAddr::V6(String::from("::1"));

我们已经展示了定义数据结构来存储第四版和第六版IP地址的几种不同方法。让我们看看标准库是如何定义IpAddr的:它拥有我们已经定义和使用的确切的enum和变量,但它以两种不同结构的形式将地址数据嵌入变量中,这两种结构针对每个变量进行了不同的定义,如下:

// 标准库中的IP4
struct Ipv4Addr {
    // --snip--
}

// 标准库中的IP6
struct Ipv6Addr {
    // --snip--
}

// 标准库中的IP地址枚举
enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}

这段代码说明了可以将任何类型的数据放入枚举变量中:例如,字符串、数值类型或结构。您甚至可以包含另一个枚举!此外,标准库类型通常并不比您可能想到的复杂多少。

请注意,即使标准库包含IpAddr的定义,我们仍然可以创建和使用自己的定义,而不会产生冲突,因为我们没有将标准库的定义纳入我们的范围。

 我们看看另外一个例子:

// 定义枚举变量Message
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

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

  • Quit根本没有与之相关的数据。
  • Move像struct一样具有命名字段。
  • Write包括单个String。
  • ChangeColor包括三个i32值。

上例中的变量定义一个enum类似于定义不同种类的struct定义,除了enum不使用struct关键字,所有的变量都被分组在Message类型下。下列结构可以保存与前面的枚举变量相同的数据:

struct QuitMessage; // 结构体单元
struct MoveMessage {
    x: i32,
    y: i32,
}
struct WriteMessage(String); // 元组结构体
struct ChangeColorMessage(i32, i32, i32); // 元组结构体

但是,如果我们使用不同的结构体,每个结构体都有自己的类型,我们就不能像使用上例中定义的单一类型的消息枚举那样容易地定义一个函数来接受这些类型的消息。

枚举和结构体之间还有一个相似之处:正如我们能够使用impl在结构上定义方法一样,我们也能够在枚举上定义方法,如下示例:

// 类似于结构体实现方法
impl Message {
    fn call(&self) {
           // 函数体
    }
}

let m = Message::Write(String::from("hello"));
m.call();

该方法的主体将使用self来获取我们调用该方法的值。在本例中,我们创建了一个值为Message::Write(String::from(" hello "))的变量m,这就是当m.call()运行时self将出现在call方法体中的内容。

可以看看标准库中另一个非常常见和有用的枚举:Option。

Option枚举

在上一节中,我们看了IpAddr 枚举如何让我们使用Rust的类型系统将更多的信息而不仅仅是数据编码到我们的程序中。本节探索了Option的一个案例研究,这是由标准库定义的另一个枚举。Option类型被用在很多地方,因为它编码了一个非常常见的场景,在这个场景中,一个值可以是某个值,也可以是空值。用类型系统来表达这个概念意味着编译器可以检查你是否已经处理了你应该处理的所有情况;这种功能可以防止在其他编程语言中极其常见的错误。

编程语言设计通常被认为是根据你包括了哪些特性,但是你排除的特性也很重要。Rust没有许多其他语言都有的null特性。Null是一个值,表示那里没有值。在有null语言中,变量总是处于两种状态之一:null或非null。

null值的问题是,如果您试图将空值用作非空值,您会得到某种错误。因为这种null或not-null属性非常普遍,所以很容易出现这种错误。

然而,null试图表达的概念仍然是有用的:null是当前由于某种原因无效或不存在的值。

问题不在于概念,而在于具体的实现。因此,Rust没有nulls,但是它有一个enum,可以对值的存在或不存在的概念进行编码。此枚举就是Option<T>。

// Option的定义
enum Option<T> {
    None,
    Some(T),
}

Option< T> 枚举非常有用,它甚至包含在引子中;您不需要将其明确纳入范围。此外,它的变体也是如此:可以不使用Option::前缀直接使用Some和None。Option<T >枚举仍然只是一个常规枚举,Some(T)和None仍然是Option<T >类型的变体。

< T >语法是Rust的一个特性,是一个泛型类型参数。

现在,您需要知道的是< T >意味着Option枚举的Some变体可以保存任何类型的一段数据,并且用来代替T的每个具体类型使整个Option<T >类型成为不同的类型。如下例所示:

// Option枚举用例
let some_number = Some(5);
let some_string = Some("a string");

let absent_number: Option<i32> = None;

some_number的类型是Option<i32 >。some_string的类型是Option<&str >,这是一种不同的类型。Rust可以推断出这些类型,因为我们已经在Some中指定了。而absent_number,Rust要求我们注释整个选项类型:编译器无法通过只查看None值来推断相应的Some变量将包含的类型。这里,我们告诉Rust,我们的意思是让absent_number的类型为Option<i32 >。

当我们有一个Some值时,我们知道一个值存在,并且这个值保存在Some中。当我们有一个None值时,在某种意义上,它和null的意思是一样的:我们没有一个有效值。

简而言之,因为Option<T >和T(其中T可以是任何类型)是不同的类型,编译器不会让我们使用Option<T >值,就好像它肯定是一个有效值一样。例如:

fn main() {
    let x: i8 = 5;
    let y: Option<i8> = Some(5);

    let sum = x + y;
    println!("sum is {}", sum)
}

编译运行

cargo run

 错误信息:

激烈!实际上,这个错误消息意味着Rust不知道如何添加i8和Option<i8 >,因为它们是不同的类型。当我们在Rust中有一个类似i8类型的值时,编译器将确保我们总是有一个有效值。 我们可以放心地继续,而不必在使用该值之前检查null。只有当我们有一个Option<i8 >(或者我们正在处理的任何类型的值)时,我们才需要担心可能没有值,编译器会确保我们在使用值之前处理了这种情况。

换句话说,您必须先将Option<T >转换为T,然后才能使用它执行T操作。一般来说,这有助于抓住null最常见的问题之一:假设某个东西实际上不为空。

不必担心错误地假定非空值,这有助于您对代码更有信心。为了获得一个可能为空的值,您必须通过将该值的类型显式的声明为Option<T >。然后,当您使用该值时,您需要显式地处理该值为空的情况。只要值的类型不是Option<T >,您就可以放心地假设该值不为空。这是Rust经过深思熟虑的设计决定,以限制空值的普遍性,并增加Rust代码的安全性。

那么,当你有一个Option<T >类型的值时,如何从某个变量中得到T值,这样你就可以使用这个值了?Option<T> 枚举提供了大量在各种情况下都有用的方法。熟悉Option<T >上的方法对您的Rust之旅非常有用。

一般来说,为了使用Option<T >值,您希望拥有处理每个变量的代码。您希望某些代码只在您有一个Some(T)值时运行,并且这些代码允许使用内部的T。如果你有一个None值,你想让其他代码运行,而那个代码没有T值可用。match表达式是一个控制流构造,当与枚举一起使用时,它可以做到这一点:它将运行不同的代码,这取决于它拥有的枚举的变体,并且该代码可以使用匹配值中的数据。

本章重点

  • 枚举Enum的含义
  • 定义枚举
  • Option<T>枚举
猿创征文 | 【Rust指南】枚举类与模式匹配精讲 书接上文,本篇博客分享的是Rust枚举类与模式匹配的知识。作为安全性强的语言,Rust 的枚举类并不像其他编程语言中的概念那样简单,但依然可以十分简单的使用。 阅读详情

相关推荐

TT电机、310电机、370电机在智能小车与机器人中的性能对比与选型指南

本文深入对比了TT电机、310电机和370电机在智能小车与机器人项目中的核心性能差异。文章从尺寸、扭矩、转速、电压电流等关键参数入手,结合不同应用场景(如入门小车、竞技机器人、机械臂),提供了清晰的选型指南和驱动控制建议,帮助开发者根据项目需求选择最合适的电机方案。

weixin_29065015的博客 409

rust 初识基础: 变量、数据类型、函数、所有权、枚举

了解到 rust 和 WebAssembly 的结合使用,可以构建前端应用,而且性能也比较好。初步学习使用rust 是预编译静态类型语言。

ngd-b的博客 1607

Potplayer + LAVFilters + madVR 配置教程

文章目录Potplayer + LAVFilters + madVR 配置教程工具安装篇设置调教1.potplayer播放器设置加载LAVFilters和madVR1.选择“源滤镜/分离器”选项,选择“滤镜/解码器管理”2.“添加外部滤镜”3.浏览到刚才LAVFilters解压的文件夹,分别添加图示项。4.添加后回到管理界面设置,点击左边的”LAV AudioDecoder”,将右边”音频解码器”...

re 16万+

rust类型转换

Rust 是类型安全的语言,因此在 Rust 中做类型转换不是一件简单的事。

zy010101博客 2963

手把手教你用UC3844设计多路输出反激电源(附PCB布局避坑指南)

本文详细介绍了使用UC3844设计多路输出反激电源的实战技巧,包括核心电路设计、变压器参数计算、PCB布局优化及EMI抑制方法。通过实验室实测数据和项目经验,帮助工程师避开常见设计陷阱,提升电源性能和可靠性。特别附赠PCB布局避坑指南,助力高效完成开关电源设计。

weixin_30300225的博客 568

[pytorch] MedicalNet 3D Resnet预训练模型迁移学习实战:从分割到分类的代码改造

本文详细介绍了如何利用PyTorch对MedicalNet 3D ResNet预训练模型进行迁移学习,从分割任务改造为分类任务。通过解析模型结构、调整分类头、加载预训练权重及优化训练策略,帮助开发者在医疗影像领域快速实现高效模型部署。文章还涵盖了数据预处理、增强技巧及模型轻量化等实用内容。

kmeans3miner的博客 246

Rust从入门到实战系列二百七十五:枚举 Enum

(“链 表 的 长 度 是: {}”, list.len());// 使 用 “hello, world!🌟🌟 在创建枚举时,你可以使用显式的整数设定枚举成员的值。// 创 建 一 个 新 的 链 表(也 是 空 的)3. 🌟🌟 枚举成员中的值可以使用模式匹配来获取。// C语 言 风 格 的 枚 举 定 义。// 打 印 列 表 的 当 前 状 态。2. 🌟 枚举成员可以持有各种类型的值。// 仅 填 空 并 修 复 错 误。// 添 加 一 些 元 素。// 修 复 错 误。

wanmeijuhao的博客 670

Java的API帮助文档

JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。 JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。 JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。 官网下载: 1、登录Oracle官网(Oracl.

人生得意须尽欢 2万+

【Rust】枚举与模式匹配

枚举是一种数据类型,允许将一个值限制为一组可能的值。例如,可以定义一个表示形状的枚举,包含矩形(Rectangle)、圆形(Circle)和三角形(Triangle)。

qq_61867911的博客 1332

微信小程序 - 实现嵌套H5页面唤起微信支付的实现方案+完整流程源码,微信小程序webview(H5页面)调用微信小程序支付,嵌套h5页面怎么实现小程序支付(Vue2/3移动端H5网页、公众号网页等)

h5嵌入微信小程序微信支付,H5网页嵌入到微信小程序内如何支付,微信小程序webview组件交互,内联h5页面并网页实现微信支付,微信H5页面实现微信小程序支付,微信小程序嵌套webview实现小程序微信支付,小程序中内嵌H5网页支付怎么办,用网页的支付还是小程序的支付?支付没反应,支付报错怎么办,微信小程序内嵌h5,h5调用小程序支付功能解决方案,H5网页cors跨域,真机测试无法唤起支付,无法唤起支付,uniapp微信小程序,h5小程序调用微信支付,微信小程序内嵌H5页面,如何实现微信支付功能,微信小程

🏆 前端领域优质创作者 1万+

泛微OA自定义post接口和路径(无侵入)

泛微OA自定义post接口和路径(无侵入)

技术分享 3869

Rust语言基础教程学习【五】(枚举和模式匹配)

枚举(enumerations),也被称作enums。枚举允许你通过列举可能的成员(variants)来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在match表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后会学习if let,另一个简洁方便处理代码中枚举的结构。

cyf1294311560的博客 1127

【RT-DETR实战】117、华为昇腾CANN部署探索:从模型转换到推理踩坑实录

本文总结了RT-DETR模型在昇腾310B芯片上部署的关键挑战与解决方案。主要遇到四大问题:1)模型转换时需注意ONNX导出设置,建议先固定尺寸验证;2)内存布局差异导致推理异常,需精确匹配NHWC/NCHW格式;3)流水线并发优化中内存复用和异步处理是关键;4)调试阶段需利用专用工具逐层比对。作者提出六条实用建议,包括小尺寸验证、预处理对齐、内存池设计等,强调部署是持续适配过程,需建立完整的测试体系应对工具链迭代。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 191

Rust编程:如何在HashSet中检查枚举变体

本文探讨了在Rust中使用HashSet检查枚举变体存在性的问题。当需要检查HashSet中是否存在特定枚举变体(而不关心内部值)时,直接使用contains方法不可行。文章提出了两种解决方案:1) 通过iter遍历和matches!宏实现的自定义函数,2) 使用宏实现通用的变体检查。这些方法允许开发者高效地检查HashSet中是否包含特定枚举变体,为处理复杂数据结构提供了实用技巧。实例展示了如何应用这些方法检查用户行为类型的存在性。

m0_74337424的博客 421

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Rust 枚举和模式匹配

枚举),也被称作enums。枚举允许你通过列举可能的成员variants)来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在match表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后会介绍if let,另一个简洁方便处理代码中枚举的结构。}", var)

专注于大数据方向,区块链,前后端,数据可视化,人工智能等领域 3210

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Rust】枚举和模式匹配

结构体给予你将字段和数据聚合在一起的方法,像Rectangle结构体有width和height两个字段。而枚举给予你一个途径去声明某个值是一个集合中的一员。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4 和 IPv6。这是程序可能会遇到的所有可能的 IP 地址类型:所以可以枚举出所有可能的值,这也正是此枚举名字的由来。任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能两者都是。

m0_72516377的博客 1214

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Rust】——枚举与模式匹配

🎯定义枚举 🎯Option枚举 🥽类似Null概念的枚举—Option 🎯控制流运算符-match 🥽绑定值得模式: 🥽匹配Option 🥽match匹配必须穷举所有的可能 🥽通配符 🎯if let

shsjssnn的博客 3413

第7章 枚举与模式匹配

Rust枚举与模式匹配 本章深入探讨Rust中枚举(enum)和模式匹配的核心特性,主要内容包括: 枚举定义与使用: Rust枚举比传统枚举更强大,能关联不同类型和数量的数据 枚举变体可以表示简单标签或复杂数据结构 可以为枚举定义关联函数和方法 Option枚举: Rust使用Option<T>处理可能缺失的值 避免空指针异常,强制显式处理None情况 模式匹配: match表达式提供强大的模式匹配能力 编译器确保所有可能情况都被处理 支持解构枚举、绑定值等高级用法 if let语法: 简化只关

百锦再的博客 849

Rust 枚举与模式匹配

可以使用 C 风格枚举为各个值存储为整数。Rust 默认会从 0 开始分配。Ok = 200,默认,Rust 会使用可容纳它们的最小内置整数类型来存储 C 风格枚举。assert_eq!assert_eq!可向枚举添加#[repr]属性来覆盖 Rust 对内存中表示法的默认选择。可使用as将 C 风格的枚举值转换为整数。反之不行。枚举也可使用derive添加各种 crate。并且可以使用impl实现自己的方法。

编程回响 1223

Rust枚举和结构体详解

Rust枚举和结构体详解 枚举(enum)是Rust中强大的数据类型,允许定义一组可能的值(变体),每个变体可关联不同类型的数据。枚举支持模式匹配,常用于状态管理和错误处理。标准库提供了Option<T>和Result<T,E>等常用枚举。 结构体(struct)用于组合多个相关字段,形成复合数据类型。通过impl块可为结构体定义方法和关联函数。结构体实例化时需为所有字段赋值,使用点号访问字段。Rust的结构体注重所有权和内存安全。 两者都是Rust类型系统的重要组成部分:枚举用于表

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1669

Rust-08-枚举和模式匹配

结构体给予你将字段和数据聚合在一起的方法,像 Rectangle 结构体有 width 和 height 两个字段。而枚举给予你将一个值成为一个集合之一的方法。比如,我们想让 Rectangle 是一些形状的集合,包含 Circle 和 Triangle。为了做到这个,Rust 提供了枚举类型。

weixin_43714208的博客 1393

Rust 的结构体、枚举与模式匹配

Rust的结构体和枚举是其类型系统的核心特性。结构体用于组合相关数据,分为三种:具名字段结构体(最常用)、元组结构体和单元结构体。通过impl块可定义方法(带self参数)和关联函数(不带self)。枚举定义可能值集合,变体可携带不同类型数据,通过match表达式进行模式匹配,具有穷尽性检查。Option和Result枚举分别安全处理空值和错误:Option<T>表示值存在(Some)或不存在(None),Result<T,E>表示成功(Ok)或失败(Err)。?操作符简化错误传播。

北京锋通科技有限公司的技术blog 898

Rust中的枚举和模式匹配

现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的Option类型是如何帮助你利用类型系统来避免出错的。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用match或if let来获取并使用这些值。你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。下一节我们学习模块系统。

qq_59931372的博客 1145

【Rust】第七节:枚举与模式匹配

是我的一点学习笔记,因为本身内容就不多、不复杂,所以这一篇内容结构与原文基本一致,但是是我个人理解原文的一个思路过程的记录。枚举,enums,如果你了解tspythonc/cppjava那你可能会觉得很熟悉,但是又很不同,rust的枚举更丰富、更灵活、更方便、更强大。所以你准备走进rust的枚举类型了吗?

RogerQianpeng的博客 2899

Rust 模式匹配语法详解

Rust的模式匹配是一种强大的特性,主要通过match表达式实现,支持多种模式类型和语法形式。核心要点包括: 基本match语法:匹配值并执行对应代码块,必须覆盖所有可能情况,可使用_通配符。 常见模式类型: 字面值、变量、通配符模式 范围模式(1..=5) 结构体和枚举模式(解构数据) 元组模式 高级特性: 守卫(guard):用if添加额外匹配条件 if let/while let简化单模式匹配 所有权注意事项:使用ref/&避免移动 特点: 编译时穷尽性检查 无运行时

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1671

Rust 语言特性:枚举

Rust枚举类型深度解析:从基础到高级应用 Rust中的枚举(Enum)是一种强大的类型系统特性,它不仅是简单的常量集合,更是结构体的容器与选择器。枚举成员可分为三类:类单元结构体型、普通结构体型和元组结构体型,每种都对应不同的数据结构。枚举值可以是唯一常量(无数据成员)或多个实例(有数据成员)。 枚举与泛型的结合尤为强大,标准库中的Option<T>就是典型代表,它优雅地处理了可能为空的值,避免了繁琐的空值检查。枚举与模式匹配的配合更是Rust的亮点,提供了清晰直观的分支处理语法。 特别值得注

Laurence的技术博客 952
上一篇: Rust之结构体(三):方法
下一篇: Rust之枚举和模式匹配(二):控制流程结构match
枫★曦
博客等级 码龄19年 251粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值