You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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:
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.
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>`}}fnmain(){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.
fnmain(){// Cài đặt bên trong macro `hello` sẽ được thay vào đây khi `cargo expand` được gọiprintln!("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}
The text was updated successfully, but these errors were encountered: