Enum và khớp mẫu trong Rust
Làm chủ enum chứa dữ liệu, khớp mẫu toàn diện với match, xử lý an toàn giá trị rỗng bằng Option, và sử dụng cú pháp gọn if let.
Bài thứ tám trong loạt Rust cơ bản. Enum giúp bạn định nghĩa một kiểu dữ liệu bằng cách liệt kê các biến thể có thể có của nó. Kết hợp với khớp mẫu (pattern matching), enum trong Rust mang lại luồng điều khiển mạnh mẽ và biểu diễn trạng thái an toàn kiểu.
Định nghĩa enum gắn dữ liệu#
Khác với enum kiểu C, enum trong Rust có thể lưu trữ dữ liệu trực tiếp bên trong từng biến thể:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let msg1 = Message::Write(String::from("hello"));
let msg2 = Message::Move { x: 10, y: 20 };
}rustKhớp mẫu với match#
Biểu thức match kiểm tra biến thể enum và trích xuất dữ liệu bên trong. Khớp mẫu trong Rust mang tính toàn diện (exhaustive) — mọi biến thể có thể xảy ra đều phải được xử lý:
fn process(msg: Message) {
match msg {
Message::Quit => println!("Nhận tín hiệu thoát"),
Message::Move { x, y } => println!("Di chuyển tới ({x}, {y})"),
Message::Write(text) => println!("Tin nhắn văn bản: {text}"),
Message::ChangeColor(r, g, b) => println!("Đổi màu thành ({r}, {g}, {b})"),
}
}rustEnum Option: Thay thế giá trị null#
Rust không có null. Thay vào đó, thư viện chuẩn định nghĩa enum Option<T> để biểu diễn sự tồn tại hoặc vắng mặt của một giá trị:
enum Option<T> {
Some(T),
None,
}rustVì Option<T> và T là hai kiểu khác nhau, trình biên dịch bắt buộc bạn phải xử lý trường hợp None trước khi truy cập T:
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
}
}
let five = Some(5);
let six = plus_one(five);
let absent = plus_one(None);rustViết gọn với if let#
Khi bạn chỉ quan tâm đến một biến thể cụ thể và bỏ qua các trường hợp còn lại, hãy dùng if let:
let config_max = Some(8u8);
if let Some(max) = config_max {
println!("Giá trị tối đa được cấu hình là {max}");
}rustKết luận#
Enum đại diện cho dữ liệu có thể rơi vào một trong nhiều khả năng, match đảm bảo mọi trường hợp được xử lý an toàn, và Option loại bỏ hoàn toàn lỗi con trỏ null. Bài tiếp theo trong loạt: collection (Vec, String, HashMap).