30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
Day 20: Match không chỉ dùng để rẻ nhánh Enum hay Option. Kích hoạt toàn bộ tiềm năng của Pattern Matching để xé nhỏ, băm nát và trích xuất mọi Struct hay Array phức tạp nhất.

Match: Không chỉ là Switch Case của C
Ở bài Số 7, chúng ta đã dùng match để kiểm tra các Option Some() hay None(). Nếu bạn nghĩ match ở Rust chỉ là phiên bản an toàn hơn của switch ở các ngôn ngữ khác, thì bạn đã bỏ lỡ 90% sức mạnh Cắt Cứ Data của nó.
Pattern Matching là nghệ thuật “so khớp hình hài”. Bất kể Struct lồng Enum của bạn sâu hoắm 4 tầng cỡ nào, match có thể móc một ngón tay xuyên thấu tận đáy để gắp Value Cần Tìm ra ngoài, mà không cần trỏ dài dòng kiểu obj.parent.child.val.

1. Mổ bụng (Destructuring) Structs & Enums siêu tốc
Thay vì phải gán biến 3 lần, bạn có thể Tóm Gọn toàn bộ thuộc tính của Struct trong 1 nốt nhạc bằng Lưới Pattern:
struct Point { x: i32, y: i32 }
fn main() {
let p = Point { x: 0, y: 7 };
match p {
// Nắm cái Điểm P mà có hoành độ x = 0, moi y ra xài
Point { x: 0, y: y_val } => println!("Nằm mẹ trên Trục Tung với Y = {}", y_val),
// P có tung độ y = 0
Point { x: x_val, y: 0 } => println!("Nằm trên Trục Hoành tại X = {}", x_val),
// Hoành tung lộn xộn, túm cổ CẢ HAI TRỌNG TÂM RA
Point { x, y } => println!("Tọa vị: Biên mạc {} và {}", x, y),
}
}Lới Cắt Rạch quá Ngọt ngào!
2. Bắt Vợ Theo Luật Mảng và Dãy Kéo Khoảng Cắt ..
Trận Đồ Bát Quái match thầu mọi thể loại mảng dữ liệu. Giả sử có 1 Array / Slice hoặc Tuple chứa rất nhiều tham số, bạn chỉ quan tâm Số Đầu và Số Đuôi, còn khoảng giữa kệ Mẹ nó:
let so_xe = (1, 6, 8, 9, 3, 5);
match so_xe {
// Dấu .. hút toàn bộ những thứ còn lại, quăng vỏ sọt rác
(first, .., last) => println!("Xe này mở bát {}, chốt nắp {}", first, last),
}Kết hợp Guard Khóa Chặn (Thêm mệnh đề if bổ trợ ngay vào Nách):
let num = Some(4);
match num {
Some(x) if x % 2 == 0 => println!("Số {} là Chẵn Chín Mõm", x), // Chỉ chui vô Cành Này Nếu IF = TRUE
Some(x) => println!("Số Lẻ Còi Xương {}", x),
None => (),
}3. Liên Kết Đổi Tên Tinh Tế @ Bindings
Kỹ thuật Bóng Đè Mạc Vạch (Biết Ranh Giới, Nhớt Luôn Giá Trị Ranh Giới): Khi bạn muốn Test tuoi coi có lọt vào Khung 3 tới 7 không, NHƯNG BẠN VẪN MUỐN LƯU cái tuổi Khởi Tạo Đó Vào Biến Có Tên id_tuoi, dùng @:
enum Message { Hello { id: i32 } }
let msg = Message::Hello { id: 5 };
match msg {
// Nếu nằm trong 3 đến 7, GÓI LUÔN CÁI HIỆN TRƯỜNG số đó vào biến 'id_chup'
Message::Hello { id: id_chup @ 3..=7 } => println!("Tóm được nhóc độ tuổi nhà trẻ: {}", id_chup),
// Nếu chỉ test Dải Range mà Không Xài cái ID:
Message::Hello { id: 10..=12 } => println!("Tuổi Trẻ Trâu Mà Lười Éo Cần Biết Tuổi Cụ Thể"),
// Ra Rìa
Message::Hello { id } => println!("Khác biệt"),
}Câu hỏi thường gặp (FAQ)
Let cũng là Pattern Matching phải không?
Cực Gắt Nhận Thức Lõi: Đúng!! Câu lệnh cơ bản nhất let x = 5 bản chất là Cắm Mẫu Khớp (Pattern x). Trình biên dịch hiểu: “Mang Cái Bộ Khuôn Mẫu phía trái của dấu == chụp vào Cái Đống Data bên phải”. Bạn Hoàn Toàn Có Thể Dùng: let (x, y, z) = (1, 2, "Nam"); Hay Cú Pháp Moi Nghẹt Cổ Tích Tuple Struct Bằng let Xuyên Tâm!
Sẵn sàng cho Ngày 21? Chúng ta sẽ trở lại mặt trận Traits nhưng ở Khóa Tử Đỉnh Phong Nâng Cao Nhất. Bí thuật định danh Trễ và Bắt Phóng Đè Function Trùng Tên ở Bãi Giao Các Interface Khác Biệt Sẽ Cực Trầm Ngọt Ở: [Day 21: Phép Thuật Traits Cao Trào (Advanced Traits)].
Chuỗi bài viết
30 Ngày Trở Thành Rustacean Tinh Hoa
Phần 20 / 30
- Phần 1 30 Ngày học Rust - Day 1: Lời chào thế giới và Vũ khí Cargo
- Phần 2 30 Ngày học Rust - Day 2: Biến, Bất biến (Mutability) và Shadowing
- Phần 3 30 Ngày học Rust - Day 3: Luồng điều khiển (Control Flow) và sức mạnh của Match
- Phần 4 30 Ngày học Rust - Day 4: Ownership - Khái niệm định hình cỗ thần khí Rust
- Phần 5 30 Ngày học Rust - Day 5: Khóa học nhặt đồ chung với References & Borrowing
- Phần 6 30 Ngày học Rust - Day 6: Đắp nặn dự án với Structs và Methods
- Phần 7 30 Ngày học Rust - Day 7: Quyền năng vô song của Enums và Pattern Matching
- Phần 8 30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
- Phần 9 30 Ngày học Rust - Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)
- Phần 10 30 Ngày học Rust - Day 10: Trị dứt điểm Ác mộng Lỗi (Error Handling)
- Phần 11 30 Ngày học Rust - Day 11: Generics - Ma thuật Đa hình kiểu dữ liệu
- Phần 12 30 Ngày học Rust - Day 12: Traits - Kẻ ban phát quyền năng và Lập pháp Hành vi
- Phần 13 30 Ngày học Rust - Day 13: Vượt qua Boss cuối 'Lifetimes' - Sinh Mệnh Biến
- Phần 14 30 Ngày học Rust - Day 14: Tận diệt Bug từ trứng nước bằng Automated Tests
- Phần 15 30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời
- Phần 16 30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
- Phần 17 30 Ngày học Rust - Day 17: Quyền năng của Smart Pointers
- Phần 18 30 Ngày học Rust - Day 18: Chinh phục Da luồng (Concurrency) - Cú đâm quyết định của Rust
- Phần 19 30 Ngày học Rust - Day 19: Tranh cãi Lập trình hướng đối tượng (OOP) trong Rust
- Phần 20 30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
- Phần 21 30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits
- Phần 22 30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
- Phần 23 30 Ngày học Rust - Day 23: Quyền năng của Đấng Tạo Hóa (Declarative Macros)
- Phần 24 30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)
- Phần 25 30 Ngày học Rust - Day 25: Xây dựng TCP Web Server Đa Luồng (Phần 1: Lõi Socket)
- Phần 26 30 Ngày học Rust - Day 26: Xây dựng TCP Web Server Đa Luồng (Phần 2: Bắn trả File HTML)
- Phần 27 30 Ngày học Rust - Day 27: Xây dựng TCP Web Server Đa Luồng (Phần 3: The Thread Pool)
- Phần 28 30 Ngày học Rust - Day 28: Xây dựng TCP Web Server Đa Luồng (Phần 4: Graceful Shutdown)
- Phần 29 30 Ngày học Rust - Day 29: Lên đỉnh Web Server Thực Chiến với Axum và Tokio
- Phần 30 30 Ngày học Rust - Day 30: Vượt Vọng Vàng - Đúc Kết Hành Trình Rustacean Tinh Hoa