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/

10-10 18:33