• 指示符

    指示符

    宏里面的参数使用一个美元符号 $ 作为前缀,并使用一个指示符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. }
    13. // 借助上述宏来创建名为 `foo` 和 `bar` 的函数。
    14. create_function!(foo);
    15. create_function!(bar);
    16. macro_rules! print_result {
    17. // 此宏接受一个 `expr` 类型的表达式,将它转换成一个字符串,
    18. // 并伴随着表达式的结果。
    19. // `expr` 指示符用于表达式。
    20. ($expression:expr) => (
    21. // `stringify!` 把表达式转换成一个字符串,正如 stringify
    22. // (意思为“字符串化”) 所表达的意思那样。
    23. println!("{:?} = {:?}",
    24. stringify!($expression),
    25. $expression)
    26. )
    27. }
    28. fn main() {
    29. foo();
    30. bar();
    31. print_result!(1u32 + 1);
    32. // 回想一下,代码块也是表达式!
    33. print_result!({
    34. let x = 1u32;
    35. x * x + 2 * x - 1
    36. });
    37. }

    这里列出全部指示符:

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