# Rust 中的枚举 (Enum)
枚举(Enumeration)是一种允许我们列举所有可能的值来定义一个类型的方式。
# 定义枚举
我们可以使用 enum
关键字来定义一个枚举类型,它的每个成员(变体)都可以代表一种可能的值。
enum IpAddrKind {
V4,
V6,
}
# 将数据附加到枚举变体
Rust 的枚举一个强大的功能是,每个变体都可以关联不同类型和数量的数据。
enum IpAddrKind {
V4(String),
V6(String),
}
let home = IpAddrKind::V4(String::from("127.0.0.1"));
let loopback = IpAddrKind::V6(String::from("::1"));
我们还可以为每个变体定义不同类型和结构的关联数据。
enum Message {
Quit,
Move { x: i32, y: i32 }, // 关联一个匿名结构体
Write(String), // 关联一个 String
ChangeColor(u8, u8, u8), // 关联一个三元组
}
# 为枚举实现方法
与结构体类似,我们也可以使用 impl
关键字为枚举定义方法。
impl Message {
fn process(&self) {
match self {
Message::Quit => println!("Quit message received"),
Message::Move { x, y } => println!("Move message received: x={}, y={}", x, y),
Message::Write(text) => println!("Write message received: {}", text),
Message::ChangeColor(r, g, b) => println!("ChangeColor message received: r={}, g={}, b={}", r, g, b),
}
}
}
# Option
枚举
Option
是一个由标准库定义的非常重要的枚举。它用于处理一个值可能存在或不存在的情况,有效地替代了其他语言中普遍存在的 null
。
Option<T>
的定义如下:
enum Option<T> {
Some(T), // 表示存在一个 T 类型的值
None, // 表示不存在值
}
使用 Option
可以让编译器强制我们处理值不存在的情况,从而提高代码的健壮性。
let x: i8 = 4;
let y: Option<i8> = Some(6);
// 为了处理 y 可能为 None 的情况,不能直接将 x 和 y 相加
// 必须使用 match 表达式来处理
match y {
Some(val) => println!("x + y = {}", x + val),
None => println!("y is None"),
}
# match
控制流运算符
match
是 Rust 中一个强大的控制流运算符,它允许我们将一个值与一系列模式进行比较,并根据匹配的模式执行相应的代码。match
常常与枚举一起使用,以确保我们处理了所有可能的变体。
match
的匹配是穷尽的,这意味着我们必须为所有可能的值提供一个分支。这在处理枚举时特别有用,因为编译器会检查是否遗漏了任何变体。
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}