宏可以将数组/向量扩展为多个索引参数吗?

时间:2016-09-18 08:17:38

标签: macros rust

是否可以编写一个将表达式扩展为多个索引参数的宏,这些参数可以传递给函数或另一个宏?

请参阅此简单的自包含示例。
目的是让unpack3v扩展为v[0], v[1], v[2]

macro_rules! elem {
    ($val:expr, $($var:expr), *) => {
        $($val == $var) || *
    }
}

// attempt to expand an array.
macro_rules! unpack3 {
    ($v:expr) => {
        $v[0], $v[1], $v[2]
    }
}

fn main() {
    let a = 2;
    let vars = [0, 1, 3];
    // works!
    if elem!(a, vars[0], vars[1], vars[2]) {
        println!("Found!");
    }
    // fails!
    if elem!(a, unpack3!(vars)) {
        println!("Found!");
    }
}

第二个例子失败了,是否可以使这个工作?

可能的解决方案可能包括:

  • 更改宏语法的使用。
  • 使用元组,然后扩展到参数。
  • 重新安排表达式以解决宏约束。

请注意,这可能与Escaping commas in macro output有关,但不认为它是重复的。

1 个答案:

答案 0 :(得分:7)

这在两个方面是不可能的。

首先,引用你自己链接的问题的答案:“不;宏的结果必须是一个完整的语法结构,如表达式或项目。你绝对不能具有随机的语法位,如逗号或右括号。“仅仅因为它不是完全一个逗号不会改变问题:函数参数的集合不是一个完整的语法结构。

其次,宏无法解析其他宏的输出。这需要急切扩展,Rust没有。 You can only do this using recursion