Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Macro in Rust #14

Open
CocDap opened this issue Mar 6, 2024 · 1 comment
Open

Macro in Rust #14

CocDap opened this issue Mar 6, 2024 · 1 comment

Comments

@CocDap
Copy link
Collaborator

CocDap commented Mar 6, 2024

  • Macro là gì?
  • Các loại macro
  • Cách sử dụng macro và cho ví dụ
@zrus
Copy link

zrus commented Mar 13, 2024

  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.
  1. 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.

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
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants