Rust 枚举的语法比较多,容易混乱,在此记录一下。
Rust 使用枚举的场景挺多的,而且使用起来有一些技巧,以后如果领悟到了,我会补充在这里。
Rust 中使用 Rust 风格的枚举主要有三种语法:
rust
enum Example {
Unit, // unit-like variant:无数据
Tuple(u64, bool), // tuple-like variant:匿名字段
Struct { value: u64 }, // struct-like variant:命名字段
}
注意,tuple-like 和 struct-like variant 中,内部字段的类型仍然可以是复杂的结构体。
不同类型的 variant 对应不同的 Match 匹配语法
rust
enum Example {
Unit,
Tuple(u64, bool),
Struct { value: u64 },
}
fn handle(example: Example) {
match example {
Example::Unit => {
// 无数据
}
Example::Tuple(num, flag) => {
// num: u64
// flag: bool
}
Example::Struct { value } => {
// value: u64
}
}
}
Rust 中的 C 风格枚举。如果一个枚举中全部变量都是 Unit-like 的,他就接近 C 风格了。Rust 枚举内部都有一个 discriminant(判别值) 用于表示当前是哪一个 variant。这个数值默认是编译器实现细节,通常不应依赖。但如果需要,也可以显式指定,如
rust
#[repr(u8)]
enum Color {
Red = 1,
Green = 2,
Blue = 3,
}
这里明确要求了每一个变量的判别值和判别值的存储类型。
#repr(u8) 在这里似乎用于指定判别值的存储类型,#repr() 也会在其他场景被使用,常用于做跨语言兼容,有机会也可以总结下他的用法。