Rust(8):枚举类型

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

今天学习的内容是 Rust 中的枚举类型

枚举类型

枚举类型也叫枚举,它表示的是一种多个类型的“或”的关系。

使用 enum 关键字来声明一个枚举类型,枚举类型的成员称为变体(variant)。

枚举有多种不同的写法,包括:

  • 不带值的枚举
  • 带值的枚举
  • 带参数的枚举

定义枚举类型

比如,定义一个行星类型的枚举,它的成员有两个:MarsEarth

enum Planet {
  Mars,
  Earth,
}

最后一个变体后面的逗号可以省略不写。

带枚举值的枚举

在声明枚举类型时,还可以显式地给成员赋值。上面的 Planet 类型就可以写成:

enum Planet {  
     Mars = 0,  
     Earth = 1,
}

再比如定义一个表示 HTTP 响应状态的枚举类型:

enum State {
    OK = 200,
    NotFound = 404,
    Error = 500,
}

带参数的枚举

在声明枚举类型时,还可以给成员带上参数,这种方式类似于函数的调用。

比如定义一个表示 IP 地址的类型,它有两个成员,分别表示 IPv4 类型的 IP 地址和 IPv6 类型的 IP 地址:

enum IpAddr {
  IPv4(u8, u8, u8, u8),
  IPv6(u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8),
}

这种带参数的枚举是 Rust 和其他语言差别最大的一种枚举。

模式匹配

要使用枚举类型,需要使用模式匹配。模式匹配是 Rust 中很重要的一个知识点,这里先简单使用 match 来获取枚举类型成员的数据:

enum IpAddr {  
    IPv4(u8, u8, u8, u8),  
    IPv6(u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8),
}
​
fn main() {
  let localhost: IpAddr = IpAddr::IPv4(127, 0, 0, 1);
  match localhost {
    IpAddr::IPv4(a, b, c, d) => {
      println!("{} {} {} {}", a, b, c, d)
    }
    _ => {} // 任何非 IPv4 类型走这条分支
  }
}

小结

本文介绍了 Rust 中的枚举类型, 和结构体类型一样,枚举主要用来创建用户自定义的类型,不同之处是它会包含所有可被列举的值。要使用枚举类型的值,需要配合模式匹配。