Table of contents
Open Table of contents
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ớidefaulttrong 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!