是否可以编写一个宏来将表达式扩展为多个索引参数,这些参数可以传递给函数或另一个宏?
看到这个简单的自包含示例.
目的是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!");
}
}
Run Code Online (Sandbox Code Playgroud)
第二个例子失败了,是否有可能使这个工作?
可能的解决方案包括:
请注意,这可能与宏输出中的转义逗号有关,但不认为它是重复的.
这在两种不同的方面是不可能的.
首先,引用你自己链接的问题的答案:"不;宏的结果必须是一个完整的语法结构,如表达式或项目.你绝对不能有像逗号或右括号一样的随机语法. " 仅仅因为它不完全是一个逗号并不会改变问题:函数参数的集合不是一个完整的语法结构.
其次,宏无法解析其他宏的输出.这需要急切扩展,Rust没有. 您只能使用递归来执行此操作.