枚举
enum 关键字允许创建一个可能是几种不同变体之一的类型。任何作为 struct 有效的变体在 enum 中也是有效的。
// 创建一个 `enum` 来分类网页事件。注意名称和类型信息如何共同指定变体:
// `PageLoad != PageUnload` 且 `KeyPress(char) != Paste(String)`。
// 每个变体都是不同且独立的。
enum WebEvent {
// `enum` 变体可以类似单元结构体(`unit-like`),
PageLoad,
PageUnload,
// 类似元组结构体,
KeyPress(char),
Paste(String),
// 或类似 C 语言的结构体。
Click { x: i64, y: i64 },
}
// 一个接受 `WebEvent` 枚举作为参数且不返回任何值的函数。
fn inspect(event: WebEvent) {
match event {
WebEvent::PageLoad => println!("页面已加载"),
WebEvent::PageUnload => println!("页面已卸载"),
// 从 `enum` 变体内部解构 `c`。
WebEvent::KeyPress(c) => println!("按下了'{}'键。", c),
WebEvent::Paste(s) => println!("粘贴了\"{}\"。", s),
// 将 `Click` 解构为 `x` 和 `y`。
WebEvent::Click { x, y } => {
println!("点击坐标:x={}, y={}。", x, y);
},
}
}
fn main() {
let pressed = WebEvent::KeyPress('x');
// `to_owned()` 从字符串切片创建一个拥有所有权的 `String`。
let pasted = WebEvent::Paste("我的文本".to_owned());
let click = WebEvent::Click { x: 20, y: 80 };
let load = WebEvent::PageLoad;
let unload = WebEvent::PageUnload;
inspect(pressed);
inspect(pasted);
inspect(click);
inspect(load);
inspect(unload);
}
类型别名
使用类型别名可以通过别名引用每个枚举变体。当枚举名称过长或过于泛化,而你想重命名它时,这会很有用。
enum VeryVerboseEnumOfThingsToDoWithNumbers {
Add,
Subtract,
}
// 创建类型别名
type Operations = VeryVerboseEnumOfThingsToDoWithNumbers;
fn main() {
// 我们可以通过别名引用每个变体,而不是使用又长又不便的名称。
let x = Operations::Add;
}
你最常见到这种用法的地方是在使用 Self 别名的 impl 块中。
enum VeryVerboseEnumOfThingsToDoWithNumbers {
Add,
Subtract,
}
impl VeryVerboseEnumOfThingsToDoWithNumbers {
fn run(&self, x: i32, y: i32) -> i32 {
match self {
Self::Add => x + y,
Self::Subtract => x - y,
}
}
}
要了解更多关于枚举和类型别名的信息,你可以阅读这个特性被稳定到 Rust 时的稳定化报告。