vbi-academy / rust-bootcamp-2024

Apache License 2.0
36 stars 13 forks source link

Macro in Rust #14

Open CocDap opened 7 months ago

CocDap commented 7 months ago
zrus commented 7 months ago
  1. Macro trong rust thuộc về metaprogramming. Macro giúp mình giảm thiểu thời gian code, giảm thiểu được sự phức tạp của việc cài đặt nếu các thư viện cung cấp các macro và đỡ được việc lặp code trong quá trình cài đặt.

  2. Có 2 loại macro chính:

    • Declarative macro: như chúng ta đã thấy trong quá trình học và làm là println!, print!, format, vec!, assert_eq! ...
    • Procedural macros: được chia làm 3 loại Custom #[derive] macros: được dùng kèm với derive attribute cho struct và enum. Attribute-like macro: tương tự như custom #[derive] nhưng có thể áp dụng được cho cả function. Function-like macro: tương tự declarative macro nhưng tham số truyền vào có thể linh hoạt hơn rất nhiều.
  3. Ví dụ cho declarative macro (không đề cập ví dụ cho procedural macros vì cài đặt khá phức tạp):

    
    #[macro_export]
    macro_rules! hello { // hello là tên của macro
    ($name:expr) => { // name là tham số được truyền vào macro và name là expression
        println!("Hello, {}!", $name); // In ra `Hello, <name>`
    }
    }

fn main() { hello!("World"); // Sẽ in ra Hello, World! }

Nếu dùng `cargo expand`, chúng ta sẽ thấy được ở hàm `main` sẽ được expand code, vì declarative macro sẽ được gọi trong lúc compile.
```rust
fn main() {
    // Cài đặt bên trong macro `hello` sẽ được thay vào đây khi `cargo expand` được gọi
    println!("Hello, {}", "World");
    // Ở đây println! cũng sẽ được expand ra nhưng nó là macro khá phức tạp nên mình sẽ giữ nguyên
    // để có cái nhìn tổng quát và đơn giản cho dễ hình dung
}