РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
36 of 1245 menu

Макрос 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!,
    который превращает выражение в строку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить