Rust(7) - Enum
在 C 的世界中 Enum 會羅列不同的類別,透過對類別的匹配執行對應的動作。 Rust Enum 的 Enum 除了用來匹配外還能自帶資料。
1. Enum:
定義一個 Enum 因為 V4 和 V6 是同類型的概念,所以用 Enum 收集在一起。
enum IpAddKind {
V4,
V6,
}
螢幕的色彩模式也是同類型的概念,所以也可以用 Enum 收集在一起。
fn main() {
let c = ColorMode::RGB;
println!("Screen color mode: {:?}", c);
}
#[derive(Debug)]
enum ColorMode {
Gray,
RGB,
BGR,
RGBA,
}
2. 加入資料:
Rust 的 Enum 不只可以用於匹配,還能夠賦予資料。
我們將 V4 的格式設定成 Tuple, V6 設定成字串。
fn main() {
let ip = IpAddKind::V4((127,0,0,1));
}
enum IpAddKind {
V4((u8, u8, u8, u8)),
V6(String),
}
3. 撰寫匹配處理:
match 可以讓我們匹配 Enum 並執行對應動作。
匹配 V4 成功時對 Tuple 進行處理而匹配 V6 成功時對 String 進行處理。
fn main() {
let ip = IpAddKind::V4((127,0,0,1));
ip.show();
}
enum IpAddKind {
V4((u8, u8, u8, u8)),
V6(String),
}
impl IpAddKind {
fn show(&self) {
match self {
IpAddKind::V4(ip) => println!("IP V4: {}.{}.{}.{}", ip.0, ip.1, ip.2, ip.3),
IpAddKind::V6(ip) => println!("IP V6: {}", ip),
}
}
}
4. 更細緻的匹配:
除了類別外還可以更近一步對資料進行匹配,下面新增 V4 127.0.0.1 時的處理。
impl IpAddKind {
fn show(&self) {
match self {
IpAddKind::V4((127, 0, 0, 1)) => println!("Local host"),
IpAddKind::V4(ip) => println!("IP V4: {}.{}.{}.{}", ip.0, ip.1, ip.2, ip.3),
IpAddKind::V6(ip) => println!("IP V6: {}", ip),
}
}
}
留言
張貼留言