指示符

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

1. macro_rules! create_function {
2. // 此宏接受一个 `ident` 指示符参数,并创建一个名为 `$func_name`
3. // 的函数。
4. // `ident` 指示符用于变量名或函数名
5. ($func_name:ident) => (
6. fn $func_name() {
7. // `stringify!` 宏把 `ident` 转换成字符串。
8. println!("You called {:?}()",
9. stringify!($func_name))
10. }
11. )
12. }

14. // 借助上述宏来创建名为 `foo` 和 `bar` 的函数。
15. create_function!(foo);
16. create_function!(bar);

18. macro_rules! print_result {
19. // 此宏接受一个 `expr` 类型的表达式,将它转换成一个字符串,
20. // 并伴随着表达式的结果。
21. // `expr` 指示符用于表达式。
22. ($expression:expr) => (
23. // `stringify!` 把表达式转换成一个字符串,正如 stringify
24. // (意思为“字符串化”) 所表达的意思那样。
25. println!("{:?} = {:?}",
26. stringify!($expression),
27. $expression)
28. )
29. }

31. fn main() {
32. foo();
33. bar();

35. print_result!(1u32 + 1);

37. // 回想一下,代码块也是表达式!
38. print_result!({
39. let x = 1u32;

41. x * x + 2 * x - 1
42. });
43. }

这里列出全部指示符:

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