持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
今天学习的内容是 Rust 中的枚举类型。
枚举类型
枚举类型也叫枚举,它表示的是一种多个类型的“或”的关系。
使用 enum
关键字来声明一个枚举类型,枚举类型的成员称为变体(variant)。
枚举有多种不同的写法,包括:
- 不带值的枚举
- 带值的枚举
- 带参数的枚举
定义枚举类型
比如,定义一个行星类型的枚举,它的成员有两个:Mars
和 Earth
:
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 中的枚举类型, 和结构体类型一样,枚举主要用来创建用户自定义的类型,不同之处是它会包含所有可被列举的值。要使用枚举类型的值,需要配合模式匹配。