• rust macro创建及使用


    • 创建一个rust macro
    macro_rules! macro_name {
        ($元变量名:片段说明符) => {};  // 元变量名需要以$符号开头
        ()=>{}; // 可以定义多条规则
    }
    
    • 1
    • 2
    • 3
    • 4
    • 当使用外部crate时,使用前缀(::)的完整路径,如use ::std::collections::HashSet;
    • 当使用当前的crate时,s使用($crate),如use $crate::mod1::fn1;
    • 片段说明符(fragment specifiers)
      • 片段说明符确定的是元变量中允许使用那种数据
      • 可用的说明符
        • item
          •   // 可以存放任何项条目
              macro_rules! demo {
                  ($i:item) => {
                      $i
                  };
              }
            
              fn main() {
                  demo!(
                      fn add(a: i32, b: i32) -> i32 {
                          a + b
                      }
                  );
                  println!("{}", add(1, 2));
                  demo!(
                      const A: &str = "demo";
                  );
                  println!("{}", A);
                  demo!(
                      mod mod_name {}
                  );
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
            • 15
            • 16
            • 17
            • 18
            • 19
            • 20
            • 21
            • 22
        • block
          •  // 块
             macro_rules! demo {
                  ($b:block) => {
                      $b
                  };
              }
              fn main() {
                  let n = demo! {
                      {
                          if 1==1{true}else{false}
                      }
                  };
                  println!("{}", n);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
        • stmt
          •  // 需要一个语句
             macro_rules! demo {
                  ($s:stmt) => {
                      $s
                  };
              }
            
              fn main() {
                  demo!(let name = "zhangsan");
                  println!("{}",name);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
        • pat_param/pat
          •  // 模式pat(pattern)
             macro_rules! demo {
                  ($p:pat) => {{
                      let n = 1;
                      match n {
                          1 => {
                              println!("1")
                          }
                          _ => {
                              println!("other num")
                          }
                      }
                  }};
              }
            
              fn main() {
                  demo!(2);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
            • 15
            • 16
            • 17
            • 18
        • expr
          •   // 表达式(expression)
              macro_rules! demo {
                  ($e:expr) => {$e};
              }
            
              fn main() {
                  demo!(2+2);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
        • ty
          • // ty(type)类型
            macro_rules! demo {
                  ($t:ty) => {
                      fn add(r: $t, l: $t) -> $t {
                          r + l
                      }
                      println!("{}", add(1, 2));
                  };
              }
            
              fn main() {
                  demo!(i32);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
        • ident
          • // 标识符(identifier)
            macro_rules! demo {
                  ($i:ident,$ii:ident) => {
                      fn $i() {
                          println!("1");
                      }
                      let $ii = 5;
                  };
              }
            
              fn main() {
                  demo!(num, five);
                  assert_eq!(5, five);
                  num();
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
            • 15
        • path
          • // path路径
            macro_rules! demo {
                  ($p:path) => {
                      use $p;
                  };
              }
            
              fn main() {
                  demo!(std::collections::HashSet);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
        • tt
          • // token tree
            macro_rules! demo {
                  ($t:tt) => {
                      $t {}
                  };
              }
            
              fn main() {
                  demo!(loop);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
        • meta
          • // 可以用派生宏或类似宏
            macro_rules! demo {
                  ($m:meta) => {
                      #[derive($m)]
                      struct Name;
                  };
              }
            
              fn main() {
                  demo!(Clone);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
        • lifetime
          • // 为元变量提供生命周期
              macro_rules! demo {
                  ($l:lifetime) => {
                      let name:&$l str = "zhangsan";
                  };
              }
            
              fn main() {
                  demo!('static);
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
        • vis
          • // 可见性(visibility)
            macro_rules! demo {
                 ($v:vis) => {
                     $v struct Name;
                 };
             }
            
             fn main() {
                 demo!(pub);
             }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
        • literal
          • // 可以是一个数字或这是字符串
              macro_rules! demo {
                  ($l:literal) => {
                      $l
                  };
              }
            
              fn main() {
                  demo!(1);
                  demo!("zhangsna");
              }
            
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
    • 重复类型的宏
      • ? : 出现0或1次
      • +: 出现至少一次
      • * : 出现0或多次
      • macro_rules! demo {
          ($($metavar:frag),*) => {
              $($metavar)*
          }
        }
        
        // 0或1次
        macro_rules! num {
          (
              $($l:literal)?
          ) => {
              $($l)?
          }
        }
        num!();
        num!(0);
        
        // 至少1次
        macro_rules! num {
          (
              $($l:literal),+
          ) => {
              $($l;)+
          }
        }
        num!(1,2,3);
        num!(0);
        
        // 0或多次
        macro_rules! num {
          (
              $($l:literal),*
          ) => {
              $($l;)*
          }
        }
        num!(1,2,3);
        num!(0);
        num!();
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
  • 相关阅读:
    IPv6 to IPv4 隧道【下一代互联网02】
    10个打工人必备AI神器,升职加薪靠AI
    2024年04月09日 Go生态洞察:2024年上半年Go开发者调查报告洞察
    单例模式---线程安全实现
    介绍kafka核心原理及底层刷盘机制,集群分片机制,消息丢失和重复消费有对应的线上解决方案
    CentOS Linux 的安装
    【优化算法】新型多目标热交换MOTEO优化算法(Matlab代码实现)
    vue3 + ant design vue项目svg格式的background-image使用配置
    STM32使用HAL库驱动DS3231
    【校招VIP】前端计算机网络之UDP相关
  • 原文地址:https://blog.csdn.net/m0_47167062/article/details/133440414