Rust枚举体


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

枚举类型使用 enum 关键词定义,以下是枚举的语法:

enum enum_name {
    variant1,
    variant2,
    variant3
}

例子:使用枚举体


该示例声明一个枚举:GenderCategory,其变体形式为“Male”和“Female”,用print! 宏打印枚举的值。

编译器将抛出一个错误  `GenderCategory` doesn't implement `Debug`,#[derive(Debug)] 用于抑制此错误。

//`derive`属性自动创建实现
//需要使该“枚举”可通过“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,gender是GenderCategory类型(这是一个枚举),可以分配Male或者Female作为值。

//`derive`属性会自动创建
implementation
//要使此“枚举”可通过以下方式打印
`fmt::Debug`.

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

//`derive`属性自动创建实现
//需要使该`struct`可以通过`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);
}

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

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

Option枚举


Option是Rust标准库中的预定义枚举,该枚举有两个值:有值无值

语法

enum Option<T> {
    Some(T),      //用于返回值
    None          //用于返回null,因为Rust不支持null关键字
}

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

Rust不支持 null 关键词,但函数可以使用Option枚举返回空值None,如果有数据要返回,函数可以返回Some(T)。

让我们通过一个例子来理解这一点:

该程序定义了一个函数 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 语句可用于比较枚举中存储的值。

以下示例定义了一个函数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

match和具有数据类型的枚举


可以将数据类型添加到枚举的每个变量中。

在下面的示例中,变量Name和Usr_ID分别是String和integer类型:

//`derive`属性自动创建实现
//需要使该“枚举”可通过“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