02-枚举
...大约 2 分钟
文章出自:@古明地盆 聊一聊 Rust 的枚举
考察这个 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"));
}
可以看到非常方便,然后继续来看另外一个关于枚举的例子,它的成员包含了各式各样的数据类型。
Powered by Waline v3.1.3