指示符

宏的参数以美元符号 $ 为前缀,并用指示符来标注类型:

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 参考手册