宏入门
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 等实现