繁体   English   中英

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

[英]Can macros expand array/vector into multiple indexed arguments?

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

请参阅此简单的自包含示例。
目的是使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!");
    }
}

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

可能的解决方案包括:

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

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

这有两种不同的方式是不可能的。

首先,引用您自己链接的问题的答案:“否;宏的结果必须是一个完整的语法构造,例如表达式或项。 绝对不能使用诸如逗号或右花括号之类的随机语法。 ” 仅仅因为它不完全是逗号就不会改变问题:函数参数的集合不是完整的语法构造。

其次,宏无法解析其他宏的输出。 这需要热切的扩展,而Rust则没有。 您只能使用递归来做到这一点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM