Rust Macros - Bắt đầu với "ty", "item", "ident" và "expr"
Bên cạnh những khả năng về đảm bảo an toàn bộ nhớ, xử lý đồng thời an toàn, tốc độ cao, v.v. thì Rust còn có một vũ khí rất “nguy hiểm” đó là các macro hay tạm dịch là lệnh-bó-sinh-mã. Nếu bạn đã từng dùng macro trong C hay C++ thì lệnh bó sinh mã trong Rust thực sự là một chân trời mới. Thậm chí, bạn còn có thể dùng nó để tạo hẳn một DSL (”Domain Specific Language”).
Các macro trong Rust dựa rất nhiều vào Regular Expression hoặc được viết tắt là Regex hay còn gọi là biểu thức chính quy. Có hai loại macro trong Rust là “declarative macro” và “procedure macro”, hai loại này cơ chế hoạt động khác nhau và tất nhiên sẽ được dùng cho những mục đích và tình huống khác nhau. Cho dù loại nào thì chúng cũng sẽ được phân giải và sinh mã ngay ở những bước đầu tiên trong quá trình biên dịch. Điều này cũng dễ hiểu vì các macro được sử dụng để sinh ra mã nguồn và phải có mã nguồn thì mới biên dịch ra mã máy được.
Trong quá trình phát triển, nếu các lập trình viên muốn xem một macro sẽ sinh ra mã nguồn như thế nào thì có thể sử dụng lệnh cargo expand, chẳng hạn với đoạn mã sau:
fn main() {
println!("Hello RustDEV Vietnam!");
}
khi chúng ta chạy lệnh cargo expand sẽ cho kết quả như sau:
fn main() {
{
::std::io::_print(format_args!("Hello, RustDEV Vietnam!\\n"));
};
}
Hãy cùng RustDEV Vietnam tìm hiểu về macro cũng như cách thức lập trình với macro trong Rust thông qua chuỗi video Rust Macros trên kênh Youtube RustDEV Vietnam.
All rights reserved