macro_rules! mtc {
( $ident:ident ) => ("ident");
( $string:expr ) => ("string");
}
fn main() {
println!("{}", mtc!("hi"));
println!("{}", mtc!(a));
}
这是行不通的。它失败并显示:
<anon>:7:25: 7:29 error: expected ident, found "hi"
<anon>:7 println!("{}", mtc!("hi"));
最佳答案
问题在于macro_rules!
机制无法退出捕获。一旦开始尝试匹配捕获,它要么成功,要么整个宏调用失败。
为此,您必须在捕获之前提供某种文字匹配,macro_rules!
可以使用它们来区分规则。例如:
macro_rules! mtc {
( ident $ident:ident ) => ("ident");
( expr $string:expr ) => ("string");
}
另外,要回答隐式问题:不,没有办法专门匹配字符串文字,或者实际上是任何其他种类的文字。
关于macros - 有什么办法可以区分Rust中的字符串和ident?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36812275/