2017-01-31 7 views
1

Учитывая следующее назначение кортежа:Можно использовать макрос для расширения в кортеж конструкторов?

let (a, b, c, d) = (Item::new(1), Item::new(10), Item::new(100), Item::new(1000)); 

Может ли это быть упрощена так, что конструктор может быть удален и сделал в макрос. например .:

let (a, b, c, d) = item_tuple!(1, 10, 100, 1000); 

Глядя на рекурсивные макросы, кажется, каждый макрос конкретизации необходимо создать действительный кортеж, поэтому макрос будет создать кортеж пар и т.д .: let (a, (b, (c, d))) = ...; (see this example).

Можно ли написать макрос, который расширяется в плоский кортеж конструкторов?

ответ

3

Вы можете принять VARIADIC аргумент в макрос и расширить его с помощью вызова Item::new() вокруг так:

macro_rules! item_tuple { 
    ($($arg:expr),*) => { 
     (
      $(Item::new($arg),)* 
     ) 
    } 
} 

С помощью этого макроса этот вызов будет работать и вести себя, как и ожидалось:

let (a, b, c, d) = item_tuple!(1, 10, 100, 1000); 

Playground link