1. Enum 基本用法
Enum(enumeration)用來定義一組可能的變體 (variant),每個變體都是這個 enum 型別的其中一個值。
enum Direction {
Up,
Down,
Left,
Right,
}
fn main() {
let d = Direction::Left;
match d {
Direction::Up => println!("Go up"),
Direction::Down => println!("Go down"),
Direction::Left => println!("Go left"),
Direction::Right => println!("Go right"),
}
}
輸出:
Go left
2. Enum 可以帶資料
變體不只是一個名字,也可以攜帶額外的資料。
enum Message {
Quit, // 沒有資料
Move { x: i32, y: i32 }, // 結構體形式
Write(String), // 單一值
ChangeColor(i32, i32, i32), // 元組形式
}
fn main() {
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
let m3 = Message::Write(String::from("hello"));
let m4 = Message::ChangeColor(255, 0, 0);
match m2 {
Message::Move { x, y } => println!("Move to ({}, {})", x, y),
_ => println!("Other message"),
}
}
輸出:
Move to (10, 20)
3. Enum 與 impl
Enum 也能用 impl 定義方法。
enum IpAddr {
V4(String),
V6(String),
}
impl IpAddr {
fn display(&self) {
match self {
IpAddr::V4(addr) => println!("IPv4: {}", addr),
IpAddr::V6(addr) => println!("IPv6: {}", addr),
}
}
}
fn main() {
let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
home.display();
loopback.display();
}
輸出:
IPv4: 127.0.0.1
IPv6: ::1
這說明 enum 不只是標記狀態,它也能和方法結合,像 struct 一樣有行為。
4. Enum 與標準庫常見應用
Rust 標準庫有很多重要的 enum,例如:
5. 學習心得與補充
今天學到的 enum 讓我覺得 Rust 在資料表達上的彈性又更上一層。和昨天的 struct 相比,struct 是一個型別裡面有多個欄位,而 enum 是一個型別可以有多種狀態。這讓我覺得很像是把 if/else 判斷換成一種更清楚的型別描述。最有趣的是,enum 還能像 struct 一樣帶資料,甚至可以混用結構體形式、元組形式,讓它的表達能力更強。我覺得這個概念跟前幾天 struct 的知識剛好互補,一個負責組合資料,一個負責分支狀態,兩個放在一起,整個語言的設計感覺就更完整了。