Вариативные интерфейсы
Интерфейсы с переменным числом параметров (вариативные интерфейсы) принимают произвольное число
аргументов. Например, println!
может принимать
произвольное число аргументов, как определено в формате строки.
Мы можем расширить наш макрос calculate!
из
предыдущей главы, чтобы он имел вариативный интерфейс:
macro_rules! calculate { // Шаблон для единичного `eval` (eval $e:expr) => {{ { let val: usize = $e; // Заставим быть переменную целым числом. println!("{} = {}", stringify!{$e}, val); } }}; // Рекурсивно декомпозируем несколько `eval` (eval $e:expr, $(eval $es:expr),+) => {{ calculate! { eval $e } calculate! { $(eval $es),+ } }}; } fn main() { calculate! { // Смотри, мама! Вариативный `calculate!`! eval 1 + 2, eval 3 + 4, eval (2 * 3) + 1 } }
Вывод:
1 + 2 = 3
3 + 4 = 7
(2 * 3) + 1 = 7