Rust 枚举

Rust 枚举

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

enum enum_name {
   variant1,
   variant2,
   variant3
}

示例:使用枚举

该示例声明了一个名为 GenderCategory 的枚举,其变体为 Male 和 Female。print! 宏显示枚举的值。如果未为 GenderCategory 实现 std::fmt::Debug 特性,则编译器将抛出错误。使用属性 #[derive(Debug)] 可以抑制此错误。

// The `derive` attribute automatically creates the implementation
// required to make this `enum` printable with `fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
   Male,Female
}
fn main() {
   let male = GenderCategory::Male;
   let female = GenderCategory::Female;

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

输出

Male
Female

Struct 和 Enum

以下示例定义了一个名为Person的结构体。字段gender的数据类型是GenderCategory枚举,可以被赋值为Male或Female。

// The `derive` attribute automatically creates the 
implementation
// required to make this `enum` printable with 
`fmt::Debug`.

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

// The `derive` attribute automatically creates the implementation
// required to make this `struct` printable with `fmt::Debug`.
#[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,并为每个对象初始化了属性 name 和 gender。

输出

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

选项枚举

选项是Rust标准库中的预定义枚举。该枚举有两个值:Some(数据)和None。

语法

enum Option<T> {
   Some(T),      //used to return a value
   None          // used to return null, as Rust doesn't support 
   the null keyword
}

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

Rust不支持null关键字。在enum Option中,值None可以被函数用来返回一个null值。如果有数据要返回,函数可以返回Some(data)

通过一个示例来理解:

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

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)

匹配语句和枚举

匹配语句可以用来比较保存在枚举中的值。下面的示例定义了一个函数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

与选项匹配

返回Option类型的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

匹配和枚举的数据类型

可以为枚举的每个变体添加数据类型。在下面的示例中,枚举的Name和Usr_ID变体分别为String和integer类型。以下示例演示了在具有数据类型的枚举中使用match语句的用法。

// The `derive` attribute automatically creates the implementation
// required to make this `enum` printable with `fmt::Debug`.
#[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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程