是否可以编写一个将表达式扩展为多个索引参数的宏,这些参数可以传递给函数或另一个宏?
请参阅此简单的自包含示例。
目的是让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!");
}
}
第二个例子失败了,是否可以使这个工作?
可能的解决方案可能包括:
请注意,这可能与Escaping commas in macro output有关,但不认为它是重复的。
答案 0 :(得分:7)
这在两个方面是不可能的。
首先,引用你自己链接的问题的答案:“不;宏的结果必须是一个完整的语法结构,如表达式或项目。你绝对不能具有随机的语法位,如逗号或右括号。“仅仅因为它不是完全一个逗号不会改变问题:函数参数的集合不是一个完整的语法结构。
其次,宏无法解析其他宏的输出。这需要急切扩展,Rust没有。 You can only do this using recursion