Rust 枚举类


Rust 枚举类

枚举类是 Rust 中的一种自定义数据类型。它允许定义一组值中的所有可能情况,并将其作为单个类型来使用。在 Rust 中,枚举类被称为 enum

定义枚举类

Rust 中定义枚举类的语法如下:

enum Name{
    Item1,
    Item2,
    Item3,
    ...
}

其中,Name是枚举类的名称,Item1Item2Item3等是枚举类的变体,也可以称为枚举成员或枚举项。

每个变体的值都是唯一的,并可以按照下标来访问。例如,如果有一个枚举类Fruit,其中包含AppleBananaOrange三个变量,那么可以通过下标访问它们的值。

enum Fruit{
    Apple,
    Banana,
    Orange,
}

fn main(){
    let fruit1 = Fruit::Apple;
    let fruit2 = Fruit::Banana;
    let fruit3 = Fruit::Orange;

    println!("{}", fruit1 as i32);    // 0
    println!("{}", fruit2 as i32);    // 1
    println!("{}", fruit3 as i32);    // 2
}

在上面的示例中,枚举类型Fruit中的每个成员都有一个唯一的数字值。通过as运算符可以将枚举成员强制转换为整数类型。

使用枚举类

在 Rust 中,枚举类通常用于模式匹配中。模式匹配是一种强大的 Rust 函数,可以通过与不同的模式匹配来实现不同的行为。例如,以下代码使用match语句检查变量值并执行相应的操作:

enum Coin{
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn value_in_cents(coin: Coin) -> u32{
    match coin{
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}

fn main(){
    let coin1 = Coin::Penny;
    let coin2 = Coin::Nickel;
    let coin3 = Coin::Dime;
    let coin4 = Coin::Quarter;

    println!("{}", value_in_cents(coin1));    // 1
    println!("{}", value_in_cents(coin2));    // 5
    println!("{}", value_in_cents(coin3));    // 10
    println!("{}", value_in_cents(coin4));    // 25
}

在上面的示例中,value_in_cents函数接受一个枚举Coin作为参数,并使用match语句检查不同的枚举成员,然后返回相应的值。运行函数将返回与传递的枚举成员匹配的值。

关联数据

Rust 的枚举还允许与每个成员关联数据。这种数据称为关联数据(associated data)。例如,考虑以下枚举类型:

enum IPAddr{
    V4(String),
    V6(String),
}

在上面的示例中,IPAddr类型有两个成员V4V6,分别用于存储 IPv4 地址和 IPv6 地址。但是,它们都需要一些数据来存储 IP 地址。因此,这些成员都采用了一个String类型的参数来接收 IP 地址。这种参数被称为枚举的关联数据。

可以通过以下方式访问关联数据:

enum IPAddr{
    V4(String),
    V6(String),
}

fn main() {
    let home = IPAddr::V4(String::from("127.0.0.1"));
    let loopback = IPAddr::V6(String::from("::1"));

    match home {
        IPAddr::V4(ip) => println!("home is IPv4 address {}", ip),
        IPAddr::V6(ip) => println!("home is IPv6 address {}", ip),
    }

    match loopback {
        IPAddr::V4(ip) => println!("loopback is IPv4 address {}", ip),
        IPAddr::V6(ip) => println!("loopback is IPv6 address {}", ip),
    }
}

在上面的代码示例中,我们创建了变量homeloopback,这些变量包含了每个成员的关联数据。我们使用match语句来检查每个成员,并访问相应的关联数据。

总结

Rust 的枚举是一种强大的自定义类型,可以定义一个枚举成员的有限集合并为每个成员分配唯一值。枚举类型通常在 Rust 中用于模式匹配和状态机等场景中,并且它还可以使用关联数据来存储更复杂的数据结构。