Định danh (designators)
Các đối số của một macro sẽ được đánh dấu bằng tiền tố dấu đô la $
và chú thích với kiểu bằng designator.
macro_rules! create_function { // Macro này nhận đối số với designator là `ident` và // tạo ra một hàm có tên là `$func_name` // Designator `ident` được dùng cho tên của biến hoặc là tên của hàm ($func_name:ident) => { fn $func_name() { // Macro `stringify!` chuyển đổi một biến với định danh là `ident` thành chuỗi string. println!("You called {:?}()", stringify!($func_name)); } }; } // Tạo ra một hàm tên là `foo` và `bar` với macro được định nghĩa ở trên. create_function!(foo); create_function!(bar); macro_rules! print_result { // Macro này sẽ nhận vào một biểu thức (expression) với kiểu là `expr` và sẽ in // biểu thức đó ra dưới dạng chuỗi string và kèm theo đó là kết quả của nó // Designator `expr` được dùng cho các biểu thức (expressions) ($expression:expr) => { // Macro `stringify!` sẽ chuyển biểu thức (expression) thành chuỗi string println!("{:?} = {:?}", stringify!($expression), $expression); }; } fn main() { foo(); bar(); print_result!(1u32 + 1); // Nhắc lại là các blocks cũng là các biểu thức (expressions) print_result!({ let x = 1u32; x * x + 2 * x - 1 }); }
Dưới đây là một vài Designator có sẵn:
block
expr
được dùng cho các biểu thức (expressions)ident
được dùng cho tên của biến hoặc hàmitem
literal
được dùng cho các hằng số literal (literal constants)pat
(pattern)path
stmt
(statement)tt
(token tree)ty
(type)vis
(visibility qualifier)
Nếu muốn coi một danh sách đầy đủ của các Designator, hãy xem ở đây Rust Reference