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