枚举 #
一、枚举定义 #
1.1 基本语法 #
rust
enum Direction {
Up,
Down,
Left,
Right,
}
fn main() {
let dir = Direction::Up;
match dir {
Direction::Up => println!("向上"),
Direction::Down => println!("向下"),
Direction::Left => println!("向左"),
Direction::Right => println!("向右"),
}
}
1.2 关联数据 #
rust
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let msg = Message::Move { x: 10, y: 20 };
match msg {
Message::Quit => println!("退出"),
Message::Move { x, y } => println!("移动到 ({}, {})", x, y),
Message::Write(text) => println!("文本: {}", text),
Message::ChangeColor(r, g, b) => println!("颜色: ({}, {}, {})", r, g, b),
}
}
二、Option 类型 #
2.1 定义 #
rust
enum Option<T> {
Some(T),
None,
}
2.2 使用 #
rust
fn main() {
let some_number = Some(5);
let some_string = Some("hello");
let absent_number: Option<i32> = None;
match some_number {
Some(n) => println!("值: {}", n),
None => println!("无值"),
}
}
2.3 if let 简化 #
rust
fn main() {
let some_value = Some(5);
if let Some(n) = some_value {
println!("值: {}", n);
}
}
2.4 Option 方法 #
rust
fn main() {
let x = Some(5);
// unwrap: 获取值,None 会 panic
println!("unwrap: {}", x.unwrap());
// unwrap_or: 提供默认值
let y: Option<i32> = None;
println!("unwrap_or: {}", y.unwrap_or(0));
// map: 转换值
let doubled = x.map(|n| n * 2);
println!("map: {:?}", doubled);
// and_then: 链式操作
let result = x.and_then(|n| Some(n + 1));
println!("and_then: {:?}", result);
}
三、Result 类型 #
3.1 定义 #
rust
enum Result<T, E> {
Ok(T),
Err(E),
}
3.2 使用 #
rust
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
Err(String::from("除零错误"))
} else {
Ok(a / b)
}
}
fn main() {
match divide(10, 2) {
Ok(result) => println!("结果: {}", result),
Err(e) => println!("错误: {}", e),
}
}
3.3 ? 运算符 #
rust
fn multiply_and_divide(a: i32, b: i32, c: i32) -> Result<i32, String> {
let quotient = divide(a, b)?;
Ok(quotient * c)
}
fn main() {
match multiply_and_divide(10, 2, 3) {
Ok(result) => println!("结果: {}", result),
Err(e) => println!("错误: {}", e),
}
}
四、枚举方法 #
4.1 定义方法 #
rust
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
impl Message {
fn call(&self) {
match self {
Message::Quit => println!("退出"),
Message::Move { x, y } => println!("移动 ({}, {})", x, y),
Message::Write(text) => println!("文本: {}", text),
}
}
}
fn main() {
let msg = Message::Write(String::from("hello"));
msg.call();
}
4.2 关联函数 #
rust
enum Status {
Pending,
InProgress,
Completed,
}
impl Status {
fn default() -> Self {
Status::Pending
}
}
fn main() {
let status = Status::default();
}
五、实践示例 #
5.1 状态机 #
rust
#[derive(Debug)]
enum TrafficLight {
Red,
Yellow,
Green,
}
impl TrafficLight {
fn next(&self) -> Self {
match self {
TrafficLight::Red => TrafficLight::Green,
TrafficLight::Green => TrafficLight::Yellow,
TrafficLight::Yellow => TrafficLight::Red,
}
}
fn duration(&self) -> u32 {
match self {
TrafficLight::Red => 60,
TrafficLight::Yellow => 5,
TrafficLight::Green => 45,
}
}
}
fn main() {
let mut light = TrafficLight::Red;
for _ in 0..5 {
println!("{:?} - {}秒", light, light.duration());
light = light.next();
}
}
5.2 表达式求值 #
rust
enum Expr {
Number(i32),
Add(Box<Expr>, Box<Expr>),
Multiply(Box<Expr>, Box<Expr>),
}
impl Expr {
fn evaluate(&self) -> i32 {
match self {
Expr::Number(n) => *n,
Expr::Add(a, b) => a.evaluate() + b.evaluate(),
Expr::Multiply(a, b) => a.evaluate() * b.evaluate(),
}
}
}
fn main() {
// (2 + 3) * 4
let expr = Expr::Multiply(
Box::new(Expr::Add(
Box::new(Expr::Number(2)),
Box::new(Expr::Number(3)),
)),
Box::new(Expr::Number(4)),
);
println!("结果: {}", expr.evaluate());
}
六、总结 #
本章学习了:
- 枚举定义和变体
- 关联数据
- Option 类型
- Result 类型
- 枚举方法
下一章,我们将学习数组与切片。
最后更新:2026-03-27