Rust - 枚举

  • 简述

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

    该示例声明了一个枚举 - GenderCategory,它具有男性和女性的变体。该打印!宏显示枚举的值。编译器将抛出一个错误,特征 std::fmt::Debug 没有为 GenderCategory 实现。属性#[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
    
  • 结构体和枚举

    下面的示例定义了一个结构 Person。字段性别GenderCategory类型(它是一个枚举),可以指定男性女性作为值。
    
    // 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 类型的对象p1p2,并为每个对象初始化了属性、名称和性别。

    输出

    
    Person { name: "Mohtashim", gender: Male }
    Person { name: "Amy", gender: Female }
    
  • Option 枚举

    Option 是 Rust 标准库中预定义的枚举。这个枚举有两个值 - Some(data)和 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关键字。值None,在enumOption,可以通过函数用于返回空值。如果有数据要返回,函数可以返回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)
    
  • 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
    
  • 与 Option 匹配

    is_even函数的例子,它返回 Option 类型,也可以用 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