Macros 宏可以扩展为模式的组合吗?

Macros 宏可以扩展为模式的组合吗?,macros,pattern-matching,rust,Macros,Pattern Matching,Rust,从Rust 1.0开始,无法将多个模式分组到一个绑定中: // It does not compile match x as char { b @ ('A' | 'Z') => println!("A or Z: {}", b), _ => println!("Try again") } // Correct version match x as char { b @ 'A' | b @ 'Z' => println!("A or Z: {}", b)

从Rust 1.0开始,无法将多个模式分组到一个绑定中:

// It does not compile
match x as char {
    b @ ('A' | 'Z') => println!("A or Z: {}", b),
    _ => println!("Try again")
}

// Correct version
match x as char {
    b @ 'A' | b @ 'Z' => println!("A or Z: {}", b),
    _ => println!("Try again")
}
我想知道宏是否可以完成绑定所有不同可能性的肮脏工作。以下是部分尝试:

macro_rules! bind_alternatives {
    ($x:ident, $e:expr) => ($x @ $e);
    ($x:ident, $e1:expr, $e2:expr) => (
        $x @ $e1 | $x @ $e2
    );
}

fn main() {
    let x = 'a';

    match x {
        bind_alternatives!(z, 'a', 'c') => println!("Matched"),
        _ => println!("No luck")
    };
}
这不会编译:

example.rs:4:18: 4:19 error: macro expansion ignores token `|` and any following
example.rs:4         $x @ $e1 | $x @ $e2
                                      ^
example.rs:12:9: 12:40 note: caused by the macro expansion here; the usage of `bind_alternatives` is likely invalid in this context
example.rs:12         bind_alternatives!(z, 'a', 'c') => println!("Matched"),

我知道宏可以扩展为模式,并且第一个括号
bind\u替代方案
确实有效。有可能推广到不止一种可能性吗?如果没有,是什么阻止了它?

宏可以扩展到模式、表达式和项等内容,但不能扩展到所有内容;具体地说,宏可以扩展为完整的AST节点,但这里要处理的不是完整的AST节点

匹配
表达式的每个分支可以有一个或多个由管道分隔的模式,以及可选的模式保护(
如果条件
)。这是所有特殊的
match
特定语法,因此不是一个完整的AST节点,也不是宏可以扩展的对象


解析器在解析时寻找一个模式,因此它将宏扩展为一个模式,该模式在
|
之前结束,不适合模式语法。因此,宏产生的结果超出了可以使用的范围,剩余的部分由于一个错误而被丢弃。

我没有完整的答案,但是
'a'|'c'
不是一个模式,它是用于组合模式的特定于匹配的语法。