Правило макроса в Rust
Правило связывает форму вызова с телом, которое подставят вместо этой записи. Слева в скобках перечисляют, что должно стоять в вызове: имя фрагмента и его вид, например одно выражение. Справа от стрелки пишут код, который окажется на месте вызова после развертывания.
Объявим макрос с именем twice, который
удваивает переданное выражение, и проверим
результат в main:
macro_rules! twice {
($n:expr) => {
$n + $n
};
}
fn main() {
let v = twice!(3);
println!("{}", v);
}
На экране число 6. Компилятор
заменил вызов на сложение 3 + 3
внутри функции, хотя в исходнике была
короткая запись с именем макроса. Отдельного
вызова функции с передачей аргумента
во время работы здесь нет.
Тот же макрос можно использовать с другим выражением, если оно подходит под образец:
macro_rules! twice {
($n:expr) => {
$n + $n
};
}
fn main() {
let a = 4;
let v = twice!(a + 1);
println!("{}", v);
}
Дано число:
let num = 5;
Опишите макрос twice по образцу
урока, подставьте это число в вызов
и выведите результат.
Дано число:
let num = 2;
Добавьте макрос удвоения выражения,
сложите это число с 3 через
вызов макроса и выведите итог.
Скажите, когда компилятор подставляет тело макроса: до сборки или во время работы программы, и чем это отличается от обычной функции.