枚举
约 545 字大约 2 分钟
2025-09-26
枚举由若干 变体 组成,变体是枚举的具体形态,可以是空的、元组样或带字段的。如果说结构体是 "把一组命名字段打包成一种固定形状",那么枚举则是 "先列出几种可能的形状"
定义一个枚举使用关键字 enum
enum IpAddrKind {
V4,
V6
}枚举值
枚举值就是某个枚举变体的具体实例,通过 :: 选择变体并(如有)传入数据来构造
fn main() {
let four: IpAddrKind = IpAddrKind::V4;
let six: IpAddrKind = IpAddrKind::V6;
}注
枚举变体挂在枚举类型的命名空间下,这样实例化任何变体时都能明确其所属类型,并避免不同枚举的同名变体冲突
当不同状态需要携带不同数据时,可以直接把数据放进各自的枚举变体里,而不是在结构体里放一个枚举再配合额外字段。这样每个变体自带所需数据,类型系统能约束只有对应状态才有这些字段,避免无效组合
结构体包装枚举
enum IpAddrKind {
V4,
V6,
}
struct IpAdder {
kind: IpAddrKind,
address: String,
}
fn main() {
let home = IpAdder {
kind: IpAddrKind::V4,
address: String::from("127.0.0.1"),
};
let loopback = IpAdder {
kind: IpAddrKind::V6,
address: String::from("::1"),
};
}枚举携带数据
enum IpAddrKind {
V4(String),
V6(String),
}
fn main() {
let home = IpAddrKind::V4(String::from("127.0.0.1"));
let loopback = IpAddrKind::V6(String::from("::1"));
}重要
- 使用枚举:描述 "若干状态之一",不同状态可能携带不同数据,需要匹配穷举分支(如消息类型、结果/错误、状态)
- 使用结构体:描述 "同时拥有这些字段" 的实体,字段总是并存(如坐标、用户信息)
Option 枚举
由于 Rust 中没有 null 值,因此 Rust 定义了 Option 枚举用于表示 有值 Some(T) 与无值 None
enum Option<T> {
Some(T),
None,
}注
Option<T>枚举被包含在了prelude中,因此无需将其显式引用到文件中,其成员Some与None也是如此- 如果只使用
None,则需要显式地声明Option<T>的类型,因为编译器无法仅通过None推断出Some的类型