Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpMcRp 109 of 288 menu
◀ ▶

Повторение в макросе в Rust

Иногда в вызове передают не одно значение, а несколько выражений через запятую. В правиле для такого списка используют повтор: один и тот же кусок шаблона разворачивают столько раз, сколько элементов в вызове. Между элементами в образце и в теле запятая задает границу повторяемого фрагмента.

Внутри повторяющегося блока имя фрагмента отмечают знаком доллара перед скобками, а после шаблона ставят звездочку, чтобы сказать компилятору: повтори этот фрагмент для каждого выражения из списка через запятую. Так собирают, например, сумму произвольного числа слагаемых.

Объявим макрос sum, который складывает все переданные выражения в одну переменную:

macro_rules! sum { ( $( $n:expr ),* ) => { { let mut t = 0; $( t += $n; )* t } }; } fn main() { let v = sum!(1, 2, 3); println!("{}", v); }

На экране число 6. Внутри развернутого кода три присваивания к t по одному на каждое выражение из вызова. Пустой список в образце тоже допустим: тогда тело не добавляет слагаемых и остается ноль.

С другим набором слагаемых развертывание дает столько же строк сложения, сколько выражений в вызове:

macro_rules! sum { ( $( $n:expr ),* ) => { { let mut t = 0; $( t += $n; )* t } }; } fn main() { let v = sum!(10, 5); println!("{}", v); }

Дано число:

let num = 4;

Скопируйте макрос суммы из урока, передайте в вызов это число, 2 и 2 и выведите результат.

Дано число:

let num = 1;

Используйте макрос sum с одним слагаемым из урока и выведите итог для этого числа.

Объясните словами, зачем в правиле нужна звездочка после повторяемого фрагмента и как запятая связывает элементы списка в вызове.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить