Z
ZHANK

宏入门

macro_rules! 声明宏、vec!/println! 原理、#[derive] 过程宏简介

宏入门

Rust 宏不是字符串替换——它们操作的是语法树macro_rules! 最常用,过程宏更强大。

学完本章你将: 掌握 macro_rules! 声明宏、vec!/println! 原理、#[derive] 简介。


macro_rules!

rust
// 定义——类似 match 的模式匹配
macro_rules! my_vec {
    // 空
    () => { Vec::new() };

    // 单个元素
    ($x:expr) => {{
        let mut v = Vec::new();
        v.push($x);
        v
    }};

    // 多个元素
    ($($x:expr),+ $(,)?) => {{
        let mut v = Vec::new();
        $(v.push($x);)+
        v
    }};
}

fn main() {
    let v1: Vec<i32> = my_vec![];
    let v2 = my_vec![42];
    let v3 = my_vec![1, 2, 3, 4, 5];

    println!("{:?}", v3);  // [1, 2, 3, 4, 5]
}

常用内置宏

rust
println!("Hello, {}!", name);   // 输出
format!("{}-{}", a, b);        // 格式化字符串
vec![1, 2, 3];                 // 创建 Vec
assert!(condition);            // 断言
assert_eq!(a, b);              // 相等断言
unimplemented!();              // 标记未完成
todo!();                       // 同上但语义不同
dbg!(&value);                  // 调试打印
include_str!("file.txt");      // 编译期嵌入文件

过程宏(简介)

rust
// #[derive] 是最常见的过程宏
#[derive(Debug, Clone, PartialEq)]
struct User {
    name: String,
    age: u32,
}
// 编译器自动生成 Debug::fmt、Clone::clone 等实现