
1. Cấu trúc Match cơ bản
`match` cho phép bạn so sánh một giá trị với một loạt các “mẫu” (patterns) và thực thi mã dựa trên mẫu nào khớp đầu tiên.
let day = 4;
match day {
1 => println!("Thứ Hai"),
2 => println!("Thứ Ba"),
3 => println!("Thứ Tư"),
4 => println!("Thứ Năm"),
5 => println!("Thứ Sáu"),
6 => println!("Thứ Bảy"),
7 => println!("Chủ Nhật"),
_ => println!("Ngày không hợp lệ"),
}
Các thành phần chính:
- `match variable { … }`: Bắt đầu khối so khớp.
- `pattern => code`: Nếu khớp mẫu, thực thi code tương ứng.
- `_` (Underscore): Đây là mẫu đại diện (wildcard), nó sẽ khớp với bất kỳ giá trị nào còn lại. Nó tương đương với `default` trong Java hay C++.
—
2. Kết hợp nhiều mẫu bằng toán tử OR (`|`)
Bạn có thể gộp nhiều giá trị vào cùng một nhánh xử lý bằng dấu gạch đứng `|`.
let month = 2;
match month {
1 | 2 | 3 => println!("Mùa Xuân"),
4 | 5 | 6 => println!("Mùa Hạ"),
7 | 8 | 9 => println!("Mùa Thu"),
10 | 11 | 12 => println!("Mùa Đông"),
_ => println!("Tháng ma thuật?"),
}
—
3. Sử dụng Match như một biểu thức
Tương tự như `if`, `match` cũng có thể trả về giá trị để gán cho một biến.
let grade = 'B';
let status = match grade {
'A' => "Xuất sắc",
'B' => "Khá",
'C' => "Trung bình",
_ => "Cần cố gắng thêm",
};
println!("Kết quả: {}", status);
⚠️ Lưu ý về kiểu dữ liệu:
Tất cả các nhánh của `match` phải trả về cùng một kiểu dữ liệu. Bạn không thể trả về số ở nhánh này và chuỗi ở nhánh kia.
—
4. Tính chất “Exhaustive” (Bao phủ hoàn toàn)
Đây là điểm làm nên sự an toàn của Rust: Compiler sẽ bắt lỗi nếu bạn không liệt kê hết mọi trường hợp có thể xảy ra.
Nếu bạn bỏ quên một trường hợp hoặc không có nhánh `_`, Rust sẽ không cho phép bạn build chương trình. Điều này đảm bảo bạn không bao giờ bỏ sót logic xử lý.
—
Lời kết Bài 6
`match` là một trong những tính năng được yêu thích nhất trong Rust vì sự rõ ràng và an toàn mà nó mang lại. Ở bài sau, chúng ta sẽ bước sang một phần quan trọng không kém: Vòng lặp (Loops) để xử lý các công việc lặp đi lặp lại.
Hẹn gặp lại các bạn!
Leave a comment