判断字段是否与枚举相同_Rust 学习笔记-14 枚举

本文是Rust学习笔记的第14部分,主要介绍了如何在Rust中使用枚举。枚举用于从可能的值列表中选择,如GenderCategory。文章讨论了结构体与枚举的结合,Option枚举及其在处理空值中的作用,以及如何使用match语句处理枚举。同时,还展示了带有数据类型的枚举变体如何存储不同类型的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rust 学习笔记-14 枚举

33a0b7548ff969ef0fda1353090c3c2f.png

在Rust编程中,当我们必须从可能的列表值中选择一个值时,我们使用枚举数据类型。 使用enum关键字声明枚举类型。

以下是enum的语法:

enum enum_name {   variant1,   variant2,   variant3}

使用枚举

该示例声明一个枚举- GenderCategory,其变体形式为Male和Female。 print! 宏显示枚举的值。 编译器将针对GenderCategory 未实现特征std :: fmt :: Debug 引发错误。

属性#[derive(Debug)] 用于抑制此错误。

//  `derive` 属性 自动创建fmt::Debug实现.// 好让这个枚举可以打印出来#[derive(Debug)]enum GenderCategory {   Male,Female}fn demo58() {   let male = GenderCategory::Male;   let female = GenderCategory::Female;   println!("{:?}",male);   println!("{:?}",female);}fn main() {    demo58();}

输出结果:

MaleFemale

结构体和枚举

看下面这个例子,定义一个结构体Person。 字段性别类型为 GenderCategory(它是一个枚举),可以将其分配为Male或Female作为值。

#[derive(Debug)]struct Person {    name: String,    gender: GenderCategory,}fn demo59() {    let p1 = Person {        name: String::from("向天问"),        gender: GenderCategory::Male,    };    let p2 = Person {        name: String::from("雷顶天"),        gender: GenderCategory::Female,    };    println!("{:?}", p1);    println!("{:?}", p2);}fn main() {    demo59();}

输出结果:

Person { name: "向天问", gender: Male }Person { name: "雷顶天", gender: Female }

Option 枚举

option 是Rust标准库中的预定义枚举。 这个枚举有两个值-Some(data)和None。

语法定义:

enum Option {   Some(T),      // 用户返回值.   None          // 用户返回空值.  类似null.}

这里,类型T表示任何类型的值。

Rust不支持null关键字。 enum Option中的值None可以由函数使用以返回空值。 如果有要返回的数据,则该函数可以返回Some(data)。

看下面这个示例:

fn is_even(no:i32)->Option {   if no%2 == 0 {      Some(true)   } else {      None   }}fn demo60() {   let result = is_even(3);   println!("{:?}",result);   println!("{:?}",is_even(30));}fn main() {    demo60();}

输出:

NoneSome(true)

该程序定义一个函数is_even(),其返回类型为Option。 该函数验证传递的值是否为偶数。 如果输入为偶数,则返回值true,否则函数返回None。

rust 没有null, 通过这种方法可以实现返回2个情况的值. 而不限定只能是某种类型, 一个用来返回是正确的值,另外一种返回空值. 为后续的判断做了明确的区分.

匹配(Match)语句和枚举

match语句可用于比较枚举中存储的值。

下面的示例定义一个函数 print_size,该函数将CarType枚举作为参数。 该功能将参数值与一组预定义的常数进行比较,并显示相应的消息.

fn print_size(car:CarType) {   match car {      CarType::Hatch => {         println!("Small sized car");      },      CarType::Sedan => {         println!("medium sized car");      },      CarType::SUV =>{         println!("Large sized Sports Utility car");      }   }}fn demo61(){   print_size(CarType::SUV);   print_size(CarType::Hatch);   print_size(CarType::Sedan);}fn main() {    demo61();}

cargo run:

Large sized Sports Utility carSmall sized carmedium sized car

Match 和 Option

返回选项类型的is_even函数示例也可以使用match语句实现,

如下例子:

fn demo62() {    match is_even(5) {        Some(data) => {            if data == true {                println!("Even no");            }        }        None => {            println!("not even");        }    }}fn main() {    demo62();}

cargo run 输出结果:

not even

匹配语句与带数据类型的枚举

可以将数据类型添加到枚举的每个变体(variant) 里面。

在下面的示例中,枚举的Name和Usr_ID变体分别为String和integer类型。 下面的示例说明将match语句与具有数据类型的枚举一起使用。

#[derive(Debug)]enum GenderCategory2 {   Name(String),Usr_ID(i32)}fn demo63() {   let p1 = GenderCategory::Name(String::from("张无忌"));   let p2 = GenderCategory::Usr_ID(100);   println!("{:?}",p1);   println!("{:?}",p2);   match p1 {      GenderCategory::Name(val)=> {         println!("{}",val);      }      GenderCategory::Usr_ID(val)=> {         println!("{}",val);      }   }}fn main() {    demo63();}

输出结果:

fn demo63() {   let p1 = GenderCategory2::Name(String::from("张无忌"));   let p2 = GenderCategory2::Usr_ID(100);   println!("{:?}",p1);   println!("{:?}",p2);   match p1 {      GenderCategory2::Name(val)=> {         println!("{}",val);      }      GenderCategory2::Usr_ID(val)=> {         println!("{}",val);      }   }}fn main() {    demo63();}

也就是说枚举可以支持不同数据类型的变量放同一个枚举内。

b9fa7b566bae1752dc2d1d8ef01ac236.png
1884a8607ed59a52721a0dc0c022a86e.png

往期回顾:

Rust学习笔记-1 Rust 介绍. Rust 学习笔记-2 环境安装 Rust学习笔记-2.1 rustup 镜像加速,飞起 Rust 学习笔记-3 Hello World Rust学习笔记-4 Rust 基础数据类型 Rust 学习笔记-5 变量与常量 Rust 学习笔记-6 有趣的字符串 Rust 学习笔记-7 可爱的操作符 Rust 学习笔记-8 条件语句与循环 Rust 学习笔记-9 函数 Rust 学习笔记-10 所有权(Rust内存安全的核心) Rust学习笔记-11 移动(转移)和借用 Rust 学习笔记-12 切片还是切丝任你选 Rust 学习笔记-13 Rust 结构体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值