有没有办法区分 Rust 中的字符串和标识?

dra*_*tis 2 macros rust

macro_rules! mtc {
    ( $ident:ident ) => ("ident");
    ( $string:expr ) => ("string");
}

fn main() {
    println!("{}", mtc!("hi"));
    println!("{}", mtc!(a));
}
Run Code Online (Sandbox Code Playgroud)

这不起作用。它失败了:

<anon>:7:25: 7:29 error: expected ident, found "hi"
<anon>:7     println!("{}", mtc!("hi"));
Run Code Online (Sandbox Code Playgroud)

DK.*_*DK. 5

问题是macro_rules!机器无法退出捕获。一旦它开始尝试匹配捕获,它要么成功,要么整个宏调用失败

为此,您必须在捕获之前提供某种文字匹配macro_rules!用于区分规则。例如:

macro_rules! mtc {
    ( ident $ident:ident ) => ("ident");
    ( expr $string:expr ) => ("string");
}
Run Code Online (Sandbox Code Playgroud)

另外,要回答隐含的问题:不,没有办法专门匹配字符串文字或任何其他类型的文字。