方唐镜

大人,我只写了一句“打”,它自动就变成了“打打打打打...”!

包龙星

这就是宏 (Macros)!代码生成的代码。你写一句,编译器帮你展开成一百句。

Rust 宏:圣旨到的魔法

宏是 Rust 中最强大的功能之一,它允许我们在编译时生成代码。

📜 声明宏 (macro_rules!)

最常见的宏,使用模式匹配来替换代码。

#[macro_export]
macro_rules! say_hello {
    () => {
        println!("Hello!");
    };
    ($name:expr) => {
        println!("Hello, {}!", $name);
    };
}

fn main() {
    say_hello!(); // 展开为 println!("Hello!");
    say_hello!("包龙星"); // 展开为 println!("Hello, 包龙星!");
}

🏗️ 过程宏 (Procedural Macros)

过程宏接收 Rust 代码作为输入,操作它,然后产生新的 Rust 代码。类似于插件。

🆚 宏 vs 函数

宏可以接收可变数量的参数(如 println!),而函数不行。宏在编译时展开,所以可以用来定义 DSL。

🪄

动手时刻:复读机

编写一个宏。

  1. 定义一个宏 repeat!
  2. 它接收两个参数:重复次数和要打印的消息。
  3. 在宏内部使用循环来打印。
  4. 在 main 中调用 repeat!(3, "我跳出来了")
查看参考答案 (点击揭榜)

macro_rules! repeat {
    ($count:expr, $msg:expr) => {
        for _ in 0..$count {
            println!("{}", $msg);
        }
    };
}

fn main() {
    repeat!(3, "我跳出来了");
    repeat!(3, "我又跳进去了");
}
                    

成就解锁:【复读机】 🦜