指示符

宏的参数使用一个美元符号 $ 作为前缀,并使用一个指示符(designator)来 注明类型:

  1. macro_rules! create_function {
  2. // 此宏接受一个 `ident` 指示符表示的参数,并创建一个名为 `$func_name` 的函数。
  3. // `ident` 指示符用于变量名或函数名
  4. ($func_name:ident) => (
  5. fn $func_name() {
  6. // `stringify!` 宏把 `ident` 转换成字符串。
  7. println!("You called {:?}()",
  8. stringify!($func_name))
  9. }
  10. )
  11. }
  12. // 借助上述宏来创建名为 `foo` 和 `bar` 的函数。
  13. create_function!(foo);
  14. create_function!(bar);
  15. macro_rules! print_result {
  16. // 此宏接受一个 `expr` 类型的表达式,并将它作为字符串,连同其结果一起
  17. // 打印出来。
  18. // `expr` 指示符表示表达式。
  19. ($expression:expr) => (
  20. // `stringify!` 把表达式*原样*转换成一个字符串。
  21. println!("{:?} = {:?}",
  22. stringify!($expression),
  23. $expression)
  24. )
  25. }
  26. fn main() {
  27. foo();
  28. bar();
  29. print_result!(1u32 + 1);
  30. // 回想一下,代码块也是表达式!
  31. print_result!({
  32. let x = 1u32;
  33. x * x + 2 * x - 1
  34. });
  35. }

这里列出全部指示符:

  • block
  • expr 用于表达式
  • ident 用于变量名或函数名
  • item
  • pat (模式 pattern)
  • path
  • stmt (语句 statement)
  • tt (标记树 token tree)
  • ty (类型 type)