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

ide*_*n42 0 macros rust

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

看到这个简单的自包含示例.
目的是unpack3扩大vv[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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

可能的解决方案包括:

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

请注意,这可能与宏输出中的转义逗号有关,但不认为它是重复的.

DK.*_*DK. 7

这在两种不同的方面是不可能的.

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

其次,宏无法解析其他宏的输出.这需要急切扩展,Rust没有. 您只能使用递归来执行此操作.