· Phạm Thành Nam · Ngôn ngữ Rust · 4 phút đọc

30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời

Day 15: Nghỉ ngơi lý thuyết. Vận dụng toàn bộ kiến thức nửa đầu khóa học để tạo một Tool dòng lệnh đục phá file Text như lệnh 'grep' của Linux.

Day 15: Nghỉ ngơi lý thuyết. Vận dụng toàn bộ kiến thức nửa đầu khóa học để tạo một Tool dòng lệnh đục phá file Text như lệnh 'grep' của Linux.

Minigrep: Vũ khí CLI đầu tay của bạn

Rust là ông vua mới trong lĩnh vực xây dựng phần mềm Công cụ dòng lệnh (Command Line Interface - CLI). Nó đã khiến hàng ngàn lệnh gõ Linux cũ kĩ (viết bằng C) bị ném vào sọt rác và lập trình lại toàn bộ bằng Rust vì tốc độ kinh hồn và tính an toàn cháy nổ của nó (Tiêu biểu: tools như ripgrep, bat, fd).

Hôm nay, thay vì học Lý Thuyết khô mòn, mình sẽ hướng dẫn cặn kẽ bạn viết một App thu nhỏ lọc Chữ qua Tệp (Mô phỏng grep). Lệnh bạn chạy sẽ như vầy: cargo run -- chien_tranh tho_ca.txt (App sẽ In ra tất cả dòng Thơ chữ chien_tranh Cụ Nằm Dưới text).

Giao diện Console CLI Tool phát sáng rực rỡ

1. Đọc Đối Lệnh Đầu Vào (Arguments)

Lệnh cargo run nằm trước. Dòng chữ chien_tranhtho_ca.txt đưa nhồi từ chuột gõ phía sau nó gọi là Args (Đối số). Cần phải tóm cổ chúng Tức Khắc.

use std::env;

fn main() {
    // Ạ Hàm gom đối số thành Mảng Các Chuỗi (String)
    let args: Vec<String> = env::args().collect();

    if args.len() < 3 {
        panic!("⚠️ Cảnh Báo: Truyền Thiếu Nước Ráp - Dùng: cargo run <chuoi_kieu_tim> <ten_file>");
    }

    let query = &args[1];
    let file_path = &args[2];

    println!("Đang quét mò từ '{}' trong file {}", query, file_path);
}

Lưu ý: args[0] là chuỗi bí ẩn - Nó là tên Thư Mục Ổ Đĩa Binary File Đang Chạy (VD: target/debug/minigrep). Cái cần chộp là Mốc 1 và Mốc 2.

2. Bổ Viện Cưa Lõi Đọc Text File

Bạn lấy Biến file_path có trên kia, mở Khoan Khóa File Hệ Thống fs. Rất hay Tạch (Vì gõ sai tên tệp, ko tồn tại). Chấp nhận bắt Hư Lỗi (Error Catching) bằng lệnh Tối Giản expect.

use std::fs;

// Tạm Để Dưới main() ...
let contents = fs::read_to_string(file_path)
    .expect("Lỗi Chết Oan Trái: Đếch đọc được file này nha bạn ey!");

println!("Đang In Rượt Có Trong Document:\n{contents}");

Nhét cho nó chạy, bạn TẠM THỜI Thấy Nó xả Full Bãi chữ cái lên Cái Màn hình đen. Vẫn Chưa Cắt Nghĩa Được Chữ Query Lỏi.

3. Duyệt Hàm Cắt Cò Chữ

Để Lọc Từ Khoá, Đỉnh Cao là Móc từng Vạch Cắt Thừa Số. Lập Vòng For Quẹo.

fn search<'a>(tu_khoa: &str, noi_dung: &'a str) -> Vec<&'a str> {
    let mut ket_qua = Vec::new();

    for line in noi_dung.lines() { // Tóm từng hàng bị bẻ Enter Break \n
        if line.contains(tu_khoa) {
            ket_qua.push(line);
        }
    }
    ket_qua
}

TRÒ CHƠI LÚ Não: Nhìn Chữ 'a. Bạn biết tại sao Hàm Rổ này Khải Có Chèn Vết Dấu 'a (Lifetime Mệnh Biến Tuần 13) Không? Vì Bạn Mượn (Borrowing) Mảng Return Vector Trả Lại Cụm Tham Chiếu Đọc Báo Mài Tường. Nếu Không Báo Mệnh Lứa Chừng, Lỡ cái file Text Chết Rụng Trong Lúc Văng Rổ Output Bơm Ngược, Quả Trình Dính Lủng (Dangling Pointer). Kéo Dài Cho Trọn 1 Kỉ Nguyên Gắn Tới Chuỗi Chứa Khơi Hàm Chuyên Cốt Nõi!

Câu hỏi thường gặp (FAQ)

Để App Này thành Chấn Động Giới Linux thật, tôi cần cài Package nào?

Để Không Phải Gõ vòng rào bẻ Mảng String bực nhọc và bắt Hụt Error Tham số (Người dùng quên Cắm Cờ). Cài Ngay Thư Viên Chẻ Đời Lập Pháp Args bá nhất Mọi Nghành: clap. Viết chưa tới 4 dòng chữ, Bơm Toàn Bộ Biến Lệ —flags Đỉnh Nhất Giao Diện Xịn Nhất Thế Kỉ!

Vì sao Bài này code Viết Liền chứ không tách Module?

Khuôn Khổ Blog Đỡ Nặng, Nhưng Gốc Nguyên Thủy: 5 Dòng Nhóm Bắt Cỏ Đầu Tiên Trong Tệp main.rs, Toàn bộ khối File search và Nịt Error Chảy Bắn Lỗ Ngầm lib.rs -> Mức Tách Ghép Crate Module Library Ở Bài Tuần 8 Vẫn Luôn Áp Dụng Chuyên Sâu!.


Sẵn sàng cho Ngày 16? Khúc vòng lập gán Mảng Vector ở trên rườm rà Quá Đáng! Lập Lệnh Rút Lõi Hàm Gốc - Chống Mổ Rễ. Băm Vạch Gập Chéo Đoạn Code Ngắn Chỉ Bằng 1 Nửa. Tiến hóa Thuật Tính [Day 16: Closures & Bơm Iterators Duyệt Chi Lăng].

Chuỗi bài viết

30 Ngày Trở Thành Rustacean Tinh Hoa

Phần 15 / 30

30 bài viết
  1. Phần 1 30 Ngày học Rust - Day 1: Lời chào thế giới và Vũ khí Cargo
  2. Phần 2 30 Ngày học Rust - Day 2: Biến, Bất biến (Mutability) và Shadowing
  3. 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
  4. Phần 4 30 Ngày học Rust - Day 4: Ownership - Khái niệm định hình cỗ thần khí Rust
  5. Phần 5 30 Ngày học Rust - Day 5: Khóa học nhặt đồ chung với References & Borrowing
  6. Phần 6 30 Ngày học Rust - Day 6: Đắp nặn dự án với Structs và Methods
  7. Phần 7 30 Ngày học Rust - Day 7: Quyền năng vô song của Enums và Pattern Matching
  8. Phần 8 30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
  9. Phần 9 30 Ngày học Rust - Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)
  10. Phần 10 30 Ngày học Rust - Day 10: Trị dứt điểm Ác mộng Lỗi (Error Handling)
  11. Phần 11 30 Ngày học Rust - Day 11: Generics - Ma thuật Đa hình kiểu dữ liệu
  12. 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
  13. Phần 13 30 Ngày học Rust - Day 13: Vượt qua Boss cuối 'Lifetimes' - Sinh Mệnh Biến
  14. 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
  15. Phần 15 30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời
  16. Phần 16 30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
  17. Phần 17 30 Ngày học Rust - Day 17: Quyền năng của Smart Pointers
  18. 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
  19. 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
  20. Phần 20 30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
  21. Phần 21 30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits
  22. Phần 22 30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
  23. Phần 23 30 Ngày học Rust - Day 23: Quyền năng của Đấng Tạo Hóa (Declarative Macros)
  24. Phần 24 30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)
  25. 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)
  26. 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)
  27. 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)
  28. 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)
  29. 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
  30. 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

Bình luận

Quay lại Blog

Bài viết liên quan

Xem tất cả bài viết »