[英]Can macros expand array/vector into multiple indexed arguments?
是否可以编写将表达式扩展为多个索引参数的宏,然后可以将其传递给函数或另一个宏?
请参阅此简单的自包含示例。
目的是使unpack3
将v
扩展为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.