11_rust_枚举

发布时间 2023-10-19 01:02:49作者: UFOFCZ

枚举

枚举允许列举所有可能的值来定义一个类型。

定义枚举

enum Color {
    RED,
    BLUE,
}

fn main() {
    let red = Color::RED; // 定义一个枚举值
    test_enum(red);
    test_enum(Color::BLUE);
}
fn test_enum(e: Color) {}

将数据附加到枚举的变体中

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

像这样,可对枚举的每个值附加数据类型,这样就不用像其他语言一样用额外的struct类包装枚举类型了。
优点:

  • 不需要额外使用struct
  • 每个变体可拥有不同的类型以及关联的数据量
enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

fn main() {
    let v4 = IpAddr::V4(192.168.1.1);
    let v6 = IpAddr::V4(String::from("::1"));
}

再比如rust标准库中的IpAddr的定义:

struct Ipv4Addr {}
struct Ipv6Addr {}
enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}

也可以是多种数据类型

enum Msg {
    Quit, // 没有关联任何数据类型
    Move {x: i32, y: i32},
    Write(String),
    Change(i32, i32, i32),
}

枚举定义方法

和struct一样,也是在impl代码块中定义枚举,第一个参数也是self。

enum Msg {
    Quit, // 没有关联任何数据类型
    Move {x: i32, y: i32},
    Write(String),
    Change(i32, i32, i32),
}
impl Msg {
    fn test(&self) {}
}