Указатели
Аргументы макроса имеют префикс знака доллара $ и тип аннотируется
с помощью указателей фрагмента:
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
});
}
Это список всех указателей:
blockexprиспользуют для обозначения выраженийidentиспользуют для обозначения имени переменной/функцииitemliteralиспользуется для литеральных константpat(образец)pathstmt(единственный оператор)tt(единственное дерево лексем)ty(тип)vis(спецификатор видимости)
Полный список указателей, вы можете увидеть в Rust Reference.