Указатели
Аргументы макроса имеют префикс знака доллара $
и тип аннотируется
с помощью указателей фрагмента:
macro_rules! create_function { // Этот макрос принимает аргумент идентификатора `ident` и // создаёт функцию с именем `$func_name`. // Идентификатор `ident` используют для обозначения имени переменной/функции. ($func_name:ident) => ( fn $func_name() { // Макрос `stringify!` преобразует `ident` в строку. println!("Вызвана функция {:?}()", stringify!($func_name)) } ) } // Создадим функции с именами `foo` и `bar` используя макрос, указанный выше. create_function!(foo); create_function!(bar); macro_rules! print_result { // Этот макрос принимает выражение типа `expr` и напечатает // его как строку вместе с результатом. // Указатель `expr` используют для обозначения выражений. ($expression:expr) => ( // `stringify!` преобразует выражение в строку *без изменений*. println!("{:?} = {:?}", stringify!($expression), $expression); ) } fn main() { foo(); bar(); print_result!(1u32 + 1); // Напомним, что блоки тоже являются выражениями! print_result!({ let x = 1u32; x * x + 2 * x - 1 }); }
Это список всех указателей:
block
expr
используют для обозначения выраженийident
используют для обозначения имени переменной/функцииitem
literal
используется для литеральных константpat
(образец)path
stmt
(единственный оператор)tt
(единственное дерево лексем)ty
(тип)vis
(спецификатор видимости)
Полный список указателей, вы можете увидеть в Rust Reference.