30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
Day 16: Biến Code vòng lặp cồng kềnh thành một dải băng chuyền tốc độ cao. Tìm hiểu sức mạnh bất biến của Closures và khả năng lazy evaluation của Iterators.

Lập trình Hàm Phân Tán (Functional Programming)
Dù Rust sinh ra ở phân khúc Hệ thống hạng nặng (System level), nó lại chứa đựng những phép thuật lấp lánh của Haskell hay Lisp. Hai công cụ mang tính biểu tượng nhất của ngôn ngữ Functional chính là Closures (Hàm ẩn danh) và Iterators (Máy duyệt mảng biến tần).
1. Closures: Hàm vô danh bắt trộm Scope
Binh đoàn function (a, b) của JS được thay bằng Mũi Nết Cắm Dọc |a, b| ở thế giới Rust.
let toc_do = 50;
// Closure: Biến gán cầm 1 Rút Code Vô Răng.
let tinh_van_toc = |x| x + toc_do; // Mặc dù khai báo trong ruột khối trên, Nó trộm được biến "toc_do"!
println!("Chạy Hết: {}", tinh_van_toc(2)); // Cắm 2 vô X, cộng Lên 52Lệnh Lấp Lắp này là Bức tranh Thuần Tuý Tĩnh Mịch. Nét siêu cấp của nó ở chỗ, Nếu Cột Cắm Tọa Trói Quanh (Ví Dụ Bạn Gói Chuỗi Cấu Trụ File Truyền Tải). Biến Mượn (Borrowing) Trong Scope đó Cắm Ngầm Trong Closure Sẽ Gây Bực Thắt Borrow Checker. Cách Xử Giảo Cắt Cầu: Từ khoá Bứng Biến Bỏ Quê Hình move.
let thung_do = vec![1, 2, 3];
// Giật Lửa Đem Thùng Đồ chạy cúp đi Nơi Khác
let xach_di = move || println!("Gói Mạng Trụ: {:?}", thung_do);
xach_di();
// Giờ Gọi print(thung_do) Ở Ngoài Rìa Nổ Bug Ngay Vi Đã Húp Quả Tròn Kéo Thằng Trọ Đi!2. Iterators: Những Mắt Xích Ngủ Động (Lazy Evaluation)
Hồi viết Dải Test Quét Thơ trong Mảng Lọc Mảng Tồn, bạn Đục Bẻ Vòng For Chặt Bức. Với Iterators, nó là Băng trượt Kéo Vận, Kênh Chuyển Dịch Bào Bán Cấp Nhánh.

Iterators Nghĩa Là NÓ ĐÉO LÀM GÌ, Cho Tới Khi Bạn Gọi Lệnh Lột Vỉ Hút Nước Đè Cột collect(). Quá trình gọi là Ngủ Động (Lazy).
let mang_so = vec![1, 2, 3];
// Biến mảng thành máy duyệt Iterator -> Bơm qua Phểu Lọc Chọn Số To -> Đóng Gói Collect Đẩy Về Mảng Lại.
let mang_ra: Vec<i32> = mang_so.into_iter()
.filter(|x| *x > 1)
.map(|x| x * 10)
.collect();
// Kết quả mang_ra Sẽ là Mảng: [20, 30] Đoạn Lọc Kẹp Gập Trên Trông Đẹp Chuẩn Chỉnh Như Quất Chữ JS. Ở Các Phiên Chuyển map và filter, Cái Rập Khuôn Cứa Khung Bọc Bên Cạnh Đó Đích Thực Là Những Anh Chàng Closures Âm Thầm Hứa Nhảy Múa Rứt Thăm Ẩn Tránh!
Câu hỏi thường gặp (FAQ)
Có Phải Chơi Chuỗi Iterators (Functional) Chạy Nặng Hơn Việc Gõ Vòng Xích Cổ Tích for (i=0;...) ?
KHÔNG! Thậm Chí Là Điều Chấn Động Rúng Mạch Vi Mạch Giả Kim. Tại Các Bài Viết Code Đo Thước RAM (Benchmark Loop Unrolling). Rust Bóp Các Cổng Closure Trộn Đi Gộp Thẳng Ra Mạch Mã Máy CPU Giống Cực Cẩn Cho Mã C. Việc Bẻ Vector Nén Iterators Trong Rust CHẠY NHANH Cực Đại Y HỆT Lệnh Gạt For Rẻ Tiền Thủ Công. Điều Cãi Mệnh Các Ngôn Ngữ Khác Vì Họ Phải Mở Object Nặng Cắm Trì Trướng. Mặc Đồ “Zero-Cost Abstraction”. Viết Tuốt Đẹp Mắt Mà K sợ Sập Hiệu Năng!
Sẵn sàng cho Ngày 17? Con trỏ Trầm Kẹp Dữ Cốt Biến Biến. Đi Chọc Sâu Quá Lòng Sứ. Biến Những Miếng Code Văng Sát Trục Biển Số Bộ Nhớ Dính Sót Tại RAM Đất Xới (The Heap). Ngày Mai Lòng Can Đảm Triển Vận Vào Khối Não Máy Qua Mệnh Biến: [Day 17: Cột Đột Nguy Bắn Trụ Mão - Smart Pointers].
Chuỗi bài viết
30 Ngày Trở Thành Rustacean Tinh Hoa
Phần 16 / 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