Rust - 枚举(Enums)

Rust - 枚举(Enums) 首页 / Rust入门教程 / Rust - 枚举(Enums)

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

enum enum_name {
   variant1,
   variant2,
   variant3
}

使用枚举

该示例声明一个枚举- GenderCategory ,其值为Male和Female, print!宏显示枚举的值,编译器将抛出错误,因为未针对GenderCategory实现 trait std::fmt::Debug ,属性#[derive(Debug)] 用于抑制此错误。

//`derive` 属性自动创建实现
//需要使用 `fmt::Debug` 使这个 `enum` 可打印。
#[derive(Debug)]
enum GenderCategory {
   Male,Female
}
fn main() {
   let male=GenderCategory::Male;
   let female=GenderCategory::Female;

   println!("{:?}",male);
   println!("{:?}",female);
}
Male
Female

结构和枚举

以下示例定义一个结构Person。 gender 字段的类型为 GenderCategory (是一个枚举),可以分配为 Male 或 Female 作为价值。

//`derive` 属性自动创建
implementation
//需要使此“枚举”可打印
`fmt::Debug`.

#[derive(Debug)]
enum GenderCategory {
   Male,Female
}

#[derive(Debug)]
struct Person {
   name:String,
   gender:GenderCategory
}

fn main() {
   let p1=Person {
      name:String::from("Mohtashim"),
      gender:GenderCategory::Male
   };
   let p2=Person {
      name:String::from("Amy"),
      gender:GenderCategory::Female
   };
   println!("{:?}",p1);
   println!("{:?}",p2);
}

该示例创建Person类型的对象 p1 和 p2 并初始化每个对象的属性,名称和性别。

Person { name: "Mohtashim", gender: Male }
Person { name: "Amy", gender: Female }

枚举选项

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

enum Option<T> {
   Some(T),      //用于返回一个值
   None          //用于返回 null
   the null keyword
}

在此,类型 T 表示任何类型的值。

无涯教程网

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

让我们通过一个示例来理解这一点-

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

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

Match枚举

match 语句可用于比较枚举中存储的值,下面的示例定义一个函数 print_size ,该函数将 CarType 枚举作为参数,该函数将参数值与一组预定义的常数进行比较,并显示相应的消息。

enum CarType {
   Hatch,
   Sedan,
   SUV
}
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 main(){
   print_size(CarType::SUV);
   print_size(CarType::Hatch);
   print_size(CarType::Sedan);
}
Large sized Sports Utility car
Small sized car
medium sized car

Match选项

返回 is_even 函数示例也可以使用match语句实现,如下所示-

fn main() {
   match is_even(5) {
      Some(data) => {
         if data==true {
            println!("Even no");
         }
      },
      None => {
         println!("not even");
      }
   }
}
fn is_even(no:i32)->Option<bool> {
   if no%2 == 0 {
      Some(true)
   } else {
      None
   }
}
not even

Match类型

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

//需要使用 `fmt::Debug` 使 `enum` 可打印。
#[derive(Debug)]
enum GenderCategory {
   Name(String),Usr_ID(i32)
}
fn main() {
   let p1=GenderCategory::Name(String::from("Mohtashim"));
   let p2=GenderCategory::Usr_ID(100);
   println!("{:?}",p1);
   println!("{:?}",p2);

   match p1 {
      GenderCategory::Name(val)=> {
         println!("{}",val);
      }
      GenderCategory::Usr_ID(val)=> {
         println!("{}",val);
      }
   }
}
Name("Mohtashim")
Usr_ID(100)
Mohtashim

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入剖析Kubernetes -〔张磊〕

Node.js开发实战 -〔杨浩〕

动态规划面试宝典 -〔卢誉声〕

Spark性能调优实战 -〔吴磊〕

如何成为学习高手 -〔高冷冷〕

云计算的必修小课 -〔吕蕴偲〕

现代C++20实战高手课 -〔卢誉声〕

结构学习力 -〔李忠秋〕

AI 应用实战课 -〔黄佳〕

好记忆不如烂笔头。留下您的足迹吧 :)