Open CocDap opened 7 months ago
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.
Có 2 loại macro chính:
println!
, print!
, format
, vec!
, assert_eq!
...#[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.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
}