【发布时间】:2021-02-27 08:08:55
【问题描述】:
给定一个带有任意数量参数的声明性macro_rules! 宏,如何根据重复扩展生成元组索引?
在下面的示例中,我希望生成第 6 行和第 7 行的 .0。
- 我尝试使用空的“替换”内部宏,例如
(@replace $x:tt) => { $x; },但这在元组构造中不起作用。 - 我意识到我可以将三个语句合并为一个,但在我的实际宏中,我也需要中间变量。
- 我基本上是在寻找与 C++ 的
std::integer_sequence等效的版本
macro_rules! the_action {
(@replace $x:tt) => {$x;};
($($queue:expr),+) => {
let iters = ($($queue.iter()),+);
let options = ($(iters.0.next())*);
let values = ($(options.0.unwrap_or_default())*);
}
}
fn main() {
let a = [1, 4];
let b = [3, 2];
let c = [5, -1];
the_action!(a);
the_action!(a, b);
the_action!(a, b, c);
}
额外问题:鉴于 Rust 中缺少可变参数泛型,我希望这在 Rust 中很常见。为什么在 macro_rules 中没有用于重复索引的内置语法?编译器肯定有可用的信息。有没有在 RFC 中讨论过这个问题?
编辑:显然是it has,但看起来它已被搁置。
【问题讨论】: