rust 声明宏学习笔记

在写 rust 版的 hello,world 时想必你一定用到了 println!(); 这个“函数”了吧,其实 println!() 就是一个声明宏

声明宏语法:

macro_rules ! 宏名字 宏规则1|宏规则2..

匹配器:

  • item : 程序项
  • block : 块表达式
  • stmt : 语句
  • pat : 模式
  • expr : 表达式
  • ty : 类型
  • ident : 标识符或关键字
  • path : 类型表达式形式的路径
  • tt : token树
  • meta : 属性
  • lifetime : 生存期 token
  • vis : 可能为空的可见性限定符
  • literal : 匹配 - ? 字面量表达式

重复符号

  • * - 表示任意数量的重复
  • + - 表示至少有一个
  • ? - 表示一个可选的匹配项

一个简单的声明宏

声明宏的调用需要在宏后面加上 ! 符号,然后使用 () [] {} 都可以,通常使用 ()

macro_rules! line {
    () => {
        println!("------------------------------------------------")
    };
}
fn main() {
    line!();
    let box1 = geometry::Box::new(23.3, 56.3, 36.5);
    println!("box1: width: {}, height: {}, length: {}", box1.width, box1.height, box1.length);
    println!("The volume of box1 is: {:.3}", box1.get_volume());
    line![];
}

带不定长参数的宏

macro_rules! line {
    () => {
        println!("------------------------------------------------")
    };

    ($($line_style: expr)*) => {
        println!("{}", $($line_style)*);
    }
}

fn main() {
    line!();
    let box1 = geometry::Box::new(23.3, 56.3, 36.5);
    println!(
        "box1: width: {}, height: {}, length: {}",
        box1.width, box1.height, box1.length
    );
    println!("The volume of box1 is: {:.3}", box1.get_volume());
    line!("+++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}

将宏放到单独的模块中

目录结构:

zsf@xiaotupo:~/code/rust_examples/helloworld$ tree .
.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── geometry
    │   ├── box.rs
    │   ├── macros.rs
    │   └── mod.rs
    └── main.rs

2 directories, 6 files

main.rs

mod geometry;

fn main() {
    line!();
    let box1 = geometry::Box::new(23.3, 56.3, 36.5);
    println!(
        "box1: width: {}, height: {}, length: {}",
        box1.width, box1.height, box1.length
    );
    println!("The volume of box1 is: {:.3}", box1.get_volume());
    line!("++++++++++++++++++++++++++++++++++++++++++++++++");
}

mod.rs

mod r#box;
pub mod macros;

pub use r#box::Box;

macros.rs


#[macro_export] // 允许外部模块使用该宏
macro_rules! line {
    () => {
        println!("------------------------------------------------")
    };

    ($($line_style: expr)*) => {
        println!("{}", $($line_style)*);
    }
}
posted @ 2023-08-13 14:17  小土坡  阅读(32)  评论(0编辑  收藏  举报