简介
在本实验中,我们将学习 Rust 中的枚举(enum),它允许创建一种可以具有多个变体的类型,包括类似单元类型、元组结构体和类 C 结构体。我们还将了解如何定义枚举变体,并使用模式匹配来处理不同的变体。此外,我们将探索类型别名,它提供了一种通过别名引用每个枚举变体的方法,使代码更简洁易读。
注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用
main.rs
,并通过rustc main.rs &&./main
进行编译和运行。
This tutorial is from open-source community. Access the source code
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
在本实验中,我们将学习 Rust 中的枚举(enum),它允许创建一种可以具有多个变体的类型,包括类似单元类型、元组结构体和类 C 结构体。我们还将了解如何定义枚举变体,并使用模式匹配来处理不同的变体。此外,我们将探索类型别名,它提供了一种通过别名引用每个枚举变体的方法,使代码更简洁易读。
注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用
main.rs
,并通过rustc main.rs &&./main
进行编译和运行。
enum
关键字允许创建一种类型,它可以是几种不同变体之一。任何作为 struct
有效的变体在 enum
中也同样有效。
// 创建一个 `enum` 来对网页事件进行分类。注意名称和类型信息如何共同指定变体:
// `PageLoad!= PageUnload` 且 `KeyPress(char)!= Paste(String)`。
// 每个变体都是不同且独立的。
enum WebEvent {
// 一个 `enum` 变体可以是类似单元类型的,
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 中稳定时的稳定报告。
恭喜你!你已经完成了枚举实验。你可以在 LabEx 中练习更多实验来提升你的技能。