Макрос macro_rules!
Макрос macro_rules! позволяет определять
собственные макросы в Rust. Он принимает имя
создаваемого макроса и набор правил, каждое из
которых состоит из образца для сопоставления
и шаблона для раскрытия. Параметром макрос
принимает один или несколько блоков вида
(образец) => { шаблон }.
Синтаксис
macro_rules! имя_макроса
{
(образец) => { шаблон };
(образец) => { шаблон };
}
Пример
Давайте создадим простой макрос greet,
который выводит приветствие:
macro_rules! greet
{
() =>
{
println!("Hello, world!");
};
}
fn main()
{
greet!();
}
Результат выполнения кода:
Hello, world!
Пример
Давайте создадим макрос say, который
принимает один аргумент и выводит его:
macro_rules! say
{
($x:expr) =>
{
println!("{}", $x);
};
}
fn main()
{
say!("abcde");
say!(12345);
}
Результат выполнения кода:
abcde
12345
Пример
Давайте создадим макрос sum, который
принимает несколько выражений и возвращает
их сумму:
macro_rules! sum
{
($($x:expr),*) =>
{
{
let mut res = 0;
$(
res += $x;
)*
res
}
};
}
fn main()
{
let res = sum!(1, 2, 3, 4, 5);
println!("{}", res);
}
Результат выполнения кода:
15
Пример
Давайте создадим макрос make_vec,
который создаёт вектор из переданных значений:
macro_rules! make_vec
{
($($x:expr),*) =>
{
{
let mut res = Vec::new();
$(
res.push($x);
)*
res
}
};
}
fn main()
{
let res = make_vec!(1, 2, 3, 4, 5);
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Смотрите также
-
ключевое слово
fn,
которое объявляет функцию -
ключевое слово
match,
которое выполняет сопоставление с образцом -
макрос
concat!,
который объединяет строковые литералы -
макрос
stringify!,
который превращает выражение в строку