跳至主要內容

02-枚举

黑静美(大自然的搬运工版)...大约 2 分钟编程rust我讨厌debug编程老师你超度我吧

文章出自:@古明地盆 聊一聊 Rust 的枚举open in new window

考察这个 IP 地址类型,到目前(Rust文件夹1的第1课)为止,我们只能知道 IP 地址的种类,却还没有办法去存储实际的 IP 地址数据。不过刚刚学习了结构体,我们可以这么做。

enum IpAddrKind {
    V4,
    V6,
}

struct IpAddr {
    kind: IpAddrKind,
    address: String,
}

fn main() {
    let home = IpAddr {
        kind: IpAddrKind::V4,
        address: String::from("127.0.0.1"),
    };
    let loopback = IpAddr {
        kind: IpAddrKind::V6,
        address: String::from("::1"),
    };
}

我们可以将枚举类型和一个字符串组合成一个结构体

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"));
}

在新的 IpAddr 枚举定义中,V4 和 V6 两个成员都被关联上了一个 String 值:

我们直接将数据附加到了枚举的每个成员中,这样便不需要额外地使用结构体。另外一个使用枚举代替结构体的优势在于:每个成员可以拥有不同类型和数量的关联数据。

还是以 IP 地址为例,IPv4 地址总是由 4 个 0~255 之间的整数部分组成。假如我们希望使用 4 个 u8 值来代表 V4 地址,并依然使用 String 值来代表 V6 地址,那么结构体就无法轻易实现这一目的了,而枚举则可以轻松地处理此类情形:

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

fn main() {
    let home = IpAddr::V4(127, 0, 0, 1);
    let loopback = IpAddr::V6(String::from("::1"));
}

可以看到非常方便,然后继续来看另外一个关于枚举的例子,它的成员包含了各式各样的数据类型。

上次编辑于:
贡献者: Heijingmei
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3