Читаем Rust на примерах полностью

В следующем подразделе мы посмотрим как в Rust объявить макрос. Есть три основные идеи:

   • Шаблоны и указатели

   • Перегрузка

   • Повторение

<p id="Указатели"><strong><a l:href="#Указатели">Указатели</a></strong></p>

Аргументы макроса имеют префикс знака доллара $ и тип аннотируется с помощью указателей фрагмента:

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.

<p id="Перегрузка"><strong><a l:href="#Перегрузка">Перегрузка</a></strong></p>

Макросы могут быть перегружены, принимая различные комбинации аргументов. В этом плане, macro_rules! может работать аналогично блоку сопоставления (match):

// `test!` будет сравнивать `$left` и `$right`

// по разному, в зависимости от того, как вы объявите их:

macro_rules! test {

// Не нужно разделять аргументы запятой.

// Можно использовать любой шаблон!

($left:expr; and $right:expr) => (

println!("{:?} и {:?} это {:?}",

stringify!($left),

stringify!($right),

$left && $right)

);

// ^ каждый блок должен заканчиваться точкой с запятой.

($left:expr; or $right:expr) => (

println!("{:?} или {:?} это {:?}",

stringify!($left),

stringify!($right),

$left || $right)

);

}

fn main() {

test!(1i32 + 1 == 2i32; and 2i32 * 2 == 4i32);

test!(true; or false);

Перейти на страницу:

Похожие книги

Компьютерные сети. 6-е изд.
Компьютерные сети. 6-е изд.

Перед вами шестое издание самой авторитетной книги по современным сетевым технологиям, написанное признанным экспертом Эндрю Таненбаумом в соавторстве со специалистом компании Google Дэвидом Уэзероллом и профессором Чикагского университета Ником Фимстером. Первая версия этого классического труда появилась на свет в далеком 1980 году, и с тех пор каждое издание книги неизменно становилось бестселлером. В книге последовательно изложены основные концепции, определяющие современное состояние компьютерных сетей и тенденции их развития. Авторы подробно объясняют устройство и принципы работы аппаратного и программного обеспечения, рассматривают все аспекты и уровни организации сетей — от физического до прикладного. Изложение теоретических принципов дополняется яркими, показательными примерами функционирования интернета и компьютерных сетей различного типа. Большое внимание уделяется сетевой безопасности. Шестое издание полностью переработано с учетом изменений, произошедших в сфере сетевых технологий за последние годы, и, в частности, освещает такие технологии, как DOCSIS, 4G и 5G, беспроводные сети стандарта 802.11ax, 100-гигабитные сети Ethernet, интернет вещей, современные транспортные протоколы CUBIC TCP, QUIC и BBR, программно-конфигурируемые сети и многое другое.

Дэвид Уэзеролл , Ник Фимстер , Эндрю Таненбаум

Учебные пособия, самоучители