指示符
宏的参数以美元符号 $
为前缀,并用指示符来标注类型:
macro_rules! create_function { // 这个宏接受一个 `ident` 指示符的参数, // 并创建一个名为 `$func_name` 的函数。 // `ident` 指示符用于变量/函数名。 ($func_name:ident) => { fn $func_name() { // `stringify!` 宏将 `ident` 转换为字符串。 println!("你调用了 {:?}()", stringify!($func_name)); } }; } // 使用上面的宏创建名为 `foo` 和 `bar` 的函数。 create_function!(foo); create_function!(bar); macro_rules! print_result { // 这个宏接受一个 `expr` 类型的表达式, // 并将其作为字符串打印出来,同时打印其结果。 // `expr` 指示符用于表达式。 ($expression:expr) => { // `stringify!` 将表达式**原样**转换为字符串。 println!("{:?} = {:?}", stringify!($expression), $expression); }; } fn main() { foo(); bar(); print_result!(1u32 + 1); // 记住,代码块也是表达式! print_result!({ let x = 1u32; x * x + 2 * x - 1 }); }
以下是一些可用的指示符:
block
expr
用于表达式ident
用于变量/函数名item
literal
用于字面常量pat
(模式 pattern)path
stmt
(语句 statement)tt
(标记树 token tree)ty
(类型 type)vis
(可见性限定符 visibility qualifier)
完整列表请参阅 Rust 参考手册。