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();
}