Enum
Giống như các ngôn ngữ khác, Enum là một kiểu giá trị đơn, chứa các biến thể (variants).
#![allow(unused)] fn main() { enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } let today = Day::Sunday; }
Enum variant có thể là
- unit variant
- tuple variant
- struct variant
#![allow(unused)] fn main() { enum FlashMessage { Success, // unit variant Error(String), // tuple variant Warning { category: i32, message: String }, // struct variant } }
match Enum
match
cực kỳ mạnh và được dùng trong Rust phổ biến.
Ví dụ sau là cách để kiểm tra một giá trị enum là variant nào.
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, } } fn main() {}
match
còn có thể trích xuất các giá trị từ tuple variant hoặc struct variant.
#![allow(unused)] fn main() { enum FlashMessage { Success, // unit variant Error(String), // tuple variant Warning { category: i32, message: String }, // struct variant } fn format_message(message: FlashMessage) -> String { match message { FlashMessage::Success => "success".to_string(), FlashMessage::Error(err) => format!("My error: {}", err), FlashMessage::Warning{ category, message } => format!("Warn: {} (category: {})", message, category), } } let m = format_message(FlashMessage::Error("something went wrong".to_string())); println!("{m}"); }
References
- https://doc.rust-lang.org/book/ch06-02-match.html
- https://blog.logrocket.com/rust-enums-and-pattern-matching/
use Enum::
Ta có thể mang variants ra ngoài scope của enum bằng use
.
enum Coin { Penny, Nickel, Dime, Quarter, } // hoặc // use self::Coin::{Penny, Nickel, Dime, Quarter}; use Coin::*; fn value_in_cents(coin: Coin) -> u8 { match coin { Penny => 1, Nickel => 5, Dime => 10, Quarter => 25, } } fn main() { assert_eq!(value_in_cents(Penny), 1); assert_eq!(value_in_cents(Coin::Penny), 1); }
impl Enum
Ta cũng có thể impl
cho enum
giống như struct
.
#![allow(unused)] fn main() { enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } // impl enum impl Day { fn today(self) -> Self { self } } // Trait trait DayOff { fn day_off(self); } // impl trait for enum impl DayOff for Day { fn day_off(self) { match self.today() { Self::Sunday | Self::Saturday => println!("day off"), _ => println!("noooo"), } } } let today = Day::Sunday; today.day_off(); }