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), } } }
留言
張貼留言