Повторение в макросе в 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 с одним
слагаемым из урока и выведите итог
для этого числа.
Объясните словами, зачем в правиле нужна звездочка после повторяемого фрагмента и как запятая связывает элементы списка в вызове.