宏可以扩展为模式组合吗?
Can macros expand to a combination of patterns?
从 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_alternatives
的第一个大括号确实有效。是否可以概括为不止一种可能性?如果不是,是什么阻止了它?
宏可以扩展到模式、表达式和项目等内容,但不能扩展到所有内容;具体来说,宏扩展为完整的 AST 节点,但您在这里处理的不是完整的 AST 节点。
match
表达式的每个分支可以有一个或多个模式,由管道分隔,以及一个可选的模式保护(if <em>条件</em>
).这都是特殊的 match
-specific 语法,因此不是完整的 AST 节点,因此不是宏可以扩展到的东西。
解析器在解析时寻找模式,因此它将宏扩展为模式,在 |
之前结束,这不符合模式语法。宏因此产生了超过可以消耗的,其余的被错误丢弃。
从 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_alternatives
的第一个大括号确实有效。是否可以概括为不止一种可能性?如果不是,是什么阻止了它?
宏可以扩展到模式、表达式和项目等内容,但不能扩展到所有内容;具体来说,宏扩展为完整的 AST 节点,但您在这里处理的不是完整的 AST 节点。
match
表达式的每个分支可以有一个或多个模式,由管道分隔,以及一个可选的模式保护(if <em>条件</em>
).这都是特殊的 match
-specific 语法,因此不是完整的 AST 节点,因此不是宏可以扩展到的东西。
解析器在解析时寻找模式,因此它将宏扩展为模式,在 |
之前结束,这不符合模式语法。宏因此产生了超过可以消耗的,其余的被错误丢弃。