如何在Rust的macro_rules!中转义美元符号?
解决方法
要实现调用test!($abc)时输出abc,正确的宏写法如下:
macro_rules! test { ($ $name:ident) => { println!(stringify!($name)); }; } fn main() { test!($abc); // 输出: abc }
原理说明
在Rust宏的匹配模式中,直接写$即可匹配输入中的字面量$符号,后面的$name:ident用于捕获$之后的标识符(比如这里的abc)。通过stringify!($name)可以将捕获到的标识符转换为字符串字面量,最终输出目标内容。
关于literal类型的可行性
不建议用literal类型实现这个需求:
literal类型用于匹配带引号的字符串、数字等字面量(如"abc"、123),但你的输入$abc中abc是无引号的标识符,用ident类型捕获更准确贴合需求。- 如果强行使用
literal,需要修改输入格式为带引号的形式(如test!($ "abc")),这不符合你原本的调用习惯,反而增加不必要的复杂度。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

