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

30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)

Day 24: Cách những Framework lớn như Serde hay Axum dệt nên ma thuật. Cắm rễ vào trình biên dịch, xẻ thịt AST Code của bạn thành Node Cây và thao túng toàn bộ chúng.

Day 24: Cách những Framework lớn như Serde hay Axum dệt nên ma thuật. Cắm rễ vào trình biên dịch, xẻ thịt AST Code của bạn thành Node Cây và thao túng toàn bộ chúng.

Lấy Chìa Khóa Quản Trị Hệ Thống Trình Biên Dịch

Kiểu Macro Khớp Hình (Declarative macro_rules!) đã quá bá đạo ở Ngày 23. Nhưng Gã khổng lồ Framework Serde (Chuyên Biến Struct thành chuỗi JSON) Không Thể Gõ So Rạch chữ Để Mò ra tên Từng Cái Biến Nằm rải rác. Chúng Cần Một Loại Phép Thuật Thao Túng Não Bộ Compiler. Lấy Lược Gỡ Luôn Cây Rễ Ký Tự Từ Khóa (Abstract Syntax Tree - AST) Của Bộ Não Biên Dịch.

Rust Cho Phép Làm Điền Rồ Đó Bằng Procedural Macros (Macro Thủ tục Cấp Chức Năng). Cấu Trúc của nó Không Phải Bảng Khớp Regex. Nó Là MỘT HÀM RUST THỰC THỤ nhận vào Mảng Code Thô (TokenStream) và Phụt Lại Chùm Code Thô Cải Tạo Mới!

Cỗ máy Lò Rèn Code Cắt Gói Cày Phóng Lập Trình Sinh Chế AST Token

Các Thể Khí Công Procedural

Vì Có Phép Thay Code Như Vị Thần Cầm Khuôn: 100% Macro Proc Không Thể Viết Chung File lib.rs Do Gã Crate App Bị Ràng Buộc Luật So Rối Kép Build Căng Dây. Bạn BUỘC PHẢI tạo Ra 1 Cái Crate (Gói Tool) Cắm Nhãn Riêng Gọi Là Khúc proc-macro = true Và Tách Trái Thẩm Gieo Vô App Root. Cực Nghệ Chuyên Môn, Gồm Ba Lực Lượng:

1. Custom #[derive] (Ma Quỷ Ký Liễn Thuộc Tích)

Đây Là Cách Bạn Phê Chuẩn Nhất!

#[derive(TuiTinhXuatJSON)] 
struct NguoiDung {
   tuoi: u8,
}

Khi Thấy Khúc derive, Con Bot Hàm Của Crate Proc Macro Sẽ Hút Dữ struct đó Vô Miệng. Chẻ rã nó Thấy Chữ NguoiDung… Hắn Lặng Im Trả Lại Cài Struct Gốc Mẹ, KÈM THEO VIẾT NỐI BỘ ĐUÔI Ở Khúc Dưới Gầm 1 Lỗ impl TuiTinhXuatJson Kèm Quất Nguyên Toàn Bộ Đoạn Code Ép Chuyển Chữ. Bạn Bấm Nhẹ Viết Chữ “derive” Nhỏ Xíu Đã Nhận Một Quán Tính Code Chục Ngàn Dòng Auto Sinh Thêm Chạy Ngầm Bọc Ruột!!!

2. Attribute-like Macros (Đóng Trần Chuyên Tượng Hàm)

Nâng Cấp Áp Chế. Cấu Lệnh Khép Trên Đỉnh Đầu Băng Giá Hàm. Nhổ Luôn Ruột Hàm Ẩn Định Đóng Lại Hoàn Toàn Tươi Màu Mới Khác!

#[tao_cuc_route(GET="/home")] 
fn xem_nha() {}

Bạn Nghĩ Axum Nắm Đầu Khảo Bếp Mạng Bằng Cách Nào? Nó Hút Hàm Này Đi Lọc Chèn Middleware Request Đầy Mật!

3. Function-like Macros

Xài In Y Hệt Macro Day 23 Gọi Ra Lệnh Búa ( VD: sql!("SELECT * FROM HACKER")). Nhưng Do Nó Được Khớp AST Proc Của Biên Dịch, Hàm Nó Cực Hiểm Xọc Vào Kiểm Mạch Data String Mà Búng Cánh Dò Regex DB Kiểm Soát Xem Mình Gõ Có Lủng Chén Lỗi Typos Chữ Hay Không Trục Xuất!

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

Để Rạch Biển Data Token Mảng Syntax Có Khó Xơi Không Vị Thần Ơi?

Không. Cộng Đồng Đã Tạo Chỗ Đáp Cực Ướt Át Và Ngon Nghẻ Là Hai Đại Thư Viện synquote.

  • Thằng syn: Ăn Vào Cụm Mã Giun Chuỗi Cắt Cưa Ra Rổ Xoay Struct Danh Tánh Lệnh AST Thông Mạng Gốc Có Thể Kiểm Toán Dễ Bằng Mắt Đọc Thường i32 Object.
  • Thằng quote: Ôm Tí Thép Chuỗi Format Nửa Kín Nửa Mở In Kẽ Hơi Rối Ra Đạn Thụt AST Sạch Mượt Áp Trả Phóng Ra! Chúng ta Toàn Lấy 2 Kẻ Này Bọc Build Crate.

Sẵn sàng cho Ngày 25? Nghía Tí Thế Đã Đủ. Hết Rồi!!! Toàn Bộ Kiến Thức Cao Đại Tối Cao Của Rust Chặn Ở Mốc Tuần Này. Tuần 5 Khởi Xướng Đỉnh Bật: Một Project Đỉnh Cao 6 Ngày. Ta Xây Web Server Lõi Cân Kép CPU Tận Tay: [Day 25: Đắp Foundation TCP Socket Áp Đất Bằng API Web]!.

Chuỗi bài viết

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

Phần 24 / 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 »