可以使用宏扩展为构造函数的元组吗?

时间:2017-01-31 23:58:37

标签: macros rust

给出以下元组赋值:

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

这可以简化,以便可以删除构造函数并将其转换为宏。 e.g:

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

从查看递归宏看来,每个宏实例化都需要创建一个有效的元组,因此宏会创建元组对,例如:let (a, (b, (c, d))) = ...;see this example)。

是否有可能编写一个扩展为构造函数的扁平元组的宏?

1 个答案:

答案 0 :(得分:3)

您可以在宏中接受一个可变参数,并通过调用Item::new()来展开它,如下所示:

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

使用此宏,此调用将起作用并按预期运行:

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

Playground link