Rust 宏编程基础
学习声明式宏(macro_rules!)和过程宏的概念与使用 · 难度:入门 · +15XP
Rust 宏简介
宏(Macros)是 Rust 中强大的元编程工具,分为声明式宏和过程宏两大类。它们可以在编译时生成代码,减少重复并实现 DSL(领域特定语言)。
声明式宏:macro_rules!
使用模式匹配来定义代码模板,最常用的宏形式:
macro_rules! say_hello {
() => {
println!("Hello!");
};
($name:expr) => {
println!("Hello, {}!", $name);
};
}
fn main() {
say_hello!();
say_hello!("Rust");
}
模式匹配与重复
宏支持多种匹配规则和重复操作:
| 语法 | 说明 |
|---|---|
$x:expr | 匹配任意表达式 |
$x:ty | 匹配类型 |
$($x:expr),* | 匹配逗号分隔的零或多个表达式 |
$($x:expr),+ | 匹配逗号分隔的一或多个表达式 |
macro_rules! vec_of_squares {
($($x:expr),*) => {
{
let mut v = Vec::new();
$(v.push($x * $x);)*
v
}
};
}
fn main() {
let squares = vec_of_squares!(1, 2, 3, 4);
println!("{:?}", squares); // [1, 4, 9, 16]
}
过程宏概述
过程宏分为三类:
- 自定义派生宏:如
#[derive(MyTrait)] - 属性宏:如
#[route(GET, "/")] - 函数宏:像函数调用,如
sql!(SELECT * FROM users)
过程宏需要额外的 crate 支持,定义在独立的 crate 中。
调试技巧
使用 cargo expand 或 log_syntax! 宏查看宏展开结果:
macro_rules! debug_expand {
($($tokens:tt)*) => {
{
// 编译期打印展开结果
log_syntax!($($tokens)*);
$($tokens)*
}
};
}练习提示: 编写一个 create_struct! 宏,接受字段名和类型列表,生成对应的结构体定义。