Rust的enum枚举的强大用法

news2024/11/6 11:12:51

在这里插入图片描述

在Rust中,enum(枚举)是一种非常强大的类型,它可以包含多个变体(variants),每个变体可以是不同的类型,包括复杂类型。这使得enum在Rust中不仅用于表示简单的状态或选项集合,还可以用于表示更复杂的数据结构。

以下是一个具体的例子,展示了Rust中enum如何包含复杂类型:

// 定义一个结构体,表示一个点(Point)
#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

// 定义一个枚举,表示不同的形状(Shape)
#[derive(Debug)]
enum Shape {
    Circle {
        radius: i32,
        center: Point, // 复杂类型:包含一个Point结构体
    },
    Rectangle {
        width: i32,
        height: i32,
        top_left: Point, // 复杂类型:包含一个Point结构体
    },
    // 可以添加更多变体,例如三角形等,每个都可以有自己的字段
}

fn main() {
    // 创建Circle形状的实例
    let circle = Shape::Circle {
        radius: 10,
        center: Point { x: 0, y: 0 },
    };

    // 创建Rectangle形状的实例
    let rectangle = Shape::Rectangle {
        width: 20,
        height: 10,
        top_left: Point { x: -10, y: -5 }, // 矩形左上角的位置
    };

    // 打印形状信息
    println!("{:?}", circle);
    println!("{:?}", rectangle);

    // 匹配形状并执行不同操作
    match circle {
        Shape::Circle { radius, center } => {
            println!("Circle with radius {} and center at ({}, {})", radius, center.x, center.y);
        },
        Shape::Rectangle { width, height, top_left } => {
            // 这里不会匹配到,因为circle是Circle变体
            // 但为了完整性,我们仍然提供这个分支
            println!("Rectangle with width {}, height {}, and top-left at ({}, {})", width, height, top_left.x, top_left.y);
        },
        // 可以添加更多变体匹配分支(尽管在这个例子中不需要)
    }

    match rectangle {
        Shape::Circle { .. } => {
            // 这里不会匹配到,因为rectangle是Rectangle变体
        },
        Shape::Rectangle { width, height, top_left } => {
            println!("Matched Rectangle: width = {}, height = {}, top-left = ({}, {})", width, height, top_left.x, top_left.y);
        },
    }
}

在这个例子中,Shape枚举有两个变体:CircleRectangle。每个变体都有自己的字段,这些字段可以是基本类型(如i32)或复杂类型(如Point结构体)。在main函数中,我们创建了Shape枚举的两个实例:一个Circle和一个Rectangle,并打印了它们的信息。然后,我们使用match表达式来匹配这些形状并执行不同的操作。

另外还可以对该枚举类型进行方法实现扩展:

enum Shape {
    Circle {
        radius: i32,
        center: Point, // 复杂类型:包含一个Point结构体
    },
    Rectangle {
        width: i32,
        height: i32,
        top_left: Point, // 复杂类型:包含一个Point结构体
    },
    // 可以添加更多变体,例如三角形等,每个都可以有自己的字段
}

impl Shape {
	pub fn area(&self) -> f64 {
		match self {
			Shape::Rectangle { width, height } => (width as f64) * (height as f64),  
            Shape::Circle { radius } => std::f64::consts::PI * (radius as f64).powi(2), 
		}
}

这个例子展示了Rust中enum如何能够包含复杂类型,并展示了如何使用这些复杂类型来进行模式匹配和数据处理。

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

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

相关文章

【初识Linux】

十点半的飞机快要到了,机场还是那么的拥挤.......................................................................... 文章目录 一、【初识指令】 1、 ls✔ 2、pwd✔ 3、cd✔ 4. touch✔ 5.mkdir✔ 6.rmdir✔ 7、rm ✔ 8.man✔ 9.cp✔ ​10、mv✔ 11、cat✔…

头歌——算法设计与分析(贪心法)

文章目录 第1关:贪心法代码 第2关:最小生成树代码 第3关:Huffman 编码代码 第4关:单源点最短路径代码 第1关:贪心法 相关知识 为了完成本关任务,你需要掌握:贪心法 ;。 贪心法,又称…

面试题:JVM(四)

new对象流程?(龙湖地产) 对象创建方法,对象的内存分配。(360安全) 1. 对象实例化 创建对象的方式有几种? 创建对象的步骤 指针碰撞:以指针为分界线,一边是已连续使用的…

【进阶sql】复杂sql收集及解析【mysql】

开发时会出现,必须写一些较复杂sql的场景 可能是给会sql的客户 提供一些统计sql 或是临时需要统计数据信息但是 开发一个统计功能有来不及的情况 也可能是报表系统组件 只支持 sql统计的情况 特地记录下这些sql 作为积累 substring 截取查询出的字符串&#xff…

Python实现全国岗位招聘信息可视化分析(源码+论文+部署讲解)

项目源码&数据源获取 利用Python实现全国岗位招聘信息可视化分析 项目背景: 1.为企业招聘决策提供科学的依据和参考,可以帮助人力资源部门、招聘机构和求职者了解当前的就业形势、行业趋势和人才需求,从而做出更明智的招聘和求职决策。…

Python毕业设计选题:基于django+vue的宠物寄养平台的设计与实现

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 1. 前台系统功能模块 系统首页界面 用户注册界面 用户登录界面 宠物商城界面 宠物店…

Linux云计算 |【第五阶段】CLOUD-DAY10

主要内容: 部署Dashboard、部署Prometheus、部署HPA集群 一、Dashboard介绍 Dashboard是基于网页的Kubernetes用户界面,可以使用Dashboard将容器应用部署到Kubernetes集群中,也可以对容器应用排错,还能管理集群资源。可以使用Da…

将Notepad++添加到右键菜单【一招实现】

一键添加注册表 复制以下代码保存为 Notepad.reg,将红框内路径修改为自己电脑的“Notepad.exe路径”后,再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\N…

Git下载-连接码云-保姆级教学(连接Gitee失败的解决)

Git介绍 码云连接 一、Git介绍 二、Git的工作机制 下载链接:Git - 下载软件包 三、使用步骤 创建一个wss的文件夹,作为‘工作空间’ 四、连接码云账号 五、连接Gitee失败的解决方法 一、Git介绍 Git是一个免费的、开源的分布式版本控制…

Spring Boot 与 Vue 共铸卓越采购管理新平台

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…

DataFlow v202410 版本更新 一站式数据处理平台

DataFlow 是 OpenCSG 推出的一站式数据处理平台,与 CSGHub 无缝集成,形成数据到模型的全生命周期闭环,助力持续优化。平台兼容多种数据格式与来源,支持本地、云端和网络数据接入,并提供高效转换和读取工具,…

【搜索引擎】俄罗斯搜索引擎yandex

俄罗斯搜索引擎yandex 1997年,俄罗斯搜索引擎Yandex(俄语意为:语言目录)首次上线,已发展成为全球第四大搜索引擎和第二大非英语搜索引擎 https://yandex.com/

电脑没有下载声卡驱动怎么办?电脑声卡驱动安装方法

在日常使用电脑的过程中,我们可能会遇到电脑没有声音的问题,这往往与声卡驱动缺失或损坏有关。声卡驱动是连接电脑硬件(声卡)与操作系统之间的桥梁,确保音频信号能够正常输入输出。那么,当电脑没有声卡驱动…

DEVOPS: 集群伸缩原理

概述 阿里云 K8S 集群的一个重要特性,是集群的节点可以动态的增加或减少有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,同时也可以在资源利用 率降低的时候,释放节点以节省费用理解实现原理,在遇到问题的…

git 删除远程不存在本地命令却能看到的分支

要删除远程不存在但本地却能看到的分支&#xff0c;你可以按照以下步骤操作&#xff1a; 删除本地分支&#xff1a; 如果你确定要删除的分支已经没有用处&#xff0c;可以使用以下命令来删除本地分支&#xff1a; git branch -d <branch-name>这里的 <branch-name>…

《Python游戏编程入门》注-第4章6

《Python游戏编程入门》的“轮询鼠标”内容介绍了通过轮询鼠标实现实时显示鼠标位置和按键状态的游戏。 1 游戏介绍 实时显示鼠标位置和按键状态的游戏如图1所示。 图1 实时显示鼠标位置和按键状态 从图1中可以看到&#xff0c;游戏界面主要分为上下两部分。其中&#xff0c…

ENNSP中ACL的实验配置

ACL&#xff1a;访问控制列表 1访问控制----在路由器的入或者出的接口上&#xff0c;匹配流量&#xff0c;之后产生动作---允许或拒绝 2.定义感兴趣流量-----帮助其他软件抓流量 访问控制的匹配规则&#xff1a; 拓扑图如下 基础配置 基础配置弄好后&#xff0c;随便p…

C++设计模式结构型模式———装饰模式

文章目录 一、引言二、装饰器模式三、总结 一、引言 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 该模式展现出了运行时的一种扩展能力&#xff0c;以及比继承更强大和灵活的设计视角和设计能力&#x…

第7章 内容共享

第 7 章 内容共享 bilibili学习地址 github代码地址 本章介绍Android不同应用之间共享内容的具体方式&#xff0c;主要包括&#xff1a;如何利用内容组件在应用之间共享数据&#xff0c;如何使用内容组件获取系统的通讯信息&#xff0c;如何借助文件提供器在应用之间共享文件…

分布式锁(redisson,看门狗,主从一致性)

目录 分布式锁一&#xff1a;基本原理和实现方式二&#xff1a;分布式锁的实现1&#xff1a;分布式锁的误删问题2&#xff1a;解决误删问题 三&#xff1a;lua脚本解决多条命令原子性问题调用lua脚本 四&#xff1a;Redisson1&#xff1a;redisson入门2&#xff1a;redisson可重…