Rust宏:元编程的利器
学习声明式宏和过程宏的基本概念,以及如何用宏减少重复代码 · 难度:入门 · +15XP
Rust宏概述
宏是Rust中强大的元编程工具,分为声明式宏(macro_rules!)和过程宏(自定义派生、属性、函数宏)。宏在编译时展开,可以生成代码,减少重复。
声明式宏
使用macro_rules!定义模式匹配的宏:
macro_rules! say_hello {
() => {
println!("Hello!");
};
($name:expr) => {
println!("Hello, {}!", $name);
};
}
say_hello!();
say_hello!("Rust");
重复模式
宏可以处理可变参数:
macro_rules! vec {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$( temp_vec.push($x); )*
temp_vec
}
};
}
let v = vec![1, 2, 3];过程宏示例
过程宏需要单独库支持,以下是一个简单的函数宏概念:
// 在lib.rs中定义
#[proc_macro]
pub fn make_answer(_input: TokenStream) -> TokenStream {
"fn answer() -> i32 { 42 }".parse().unwrap()
}| 宏类型 | 用途 | 定义方式 |
|---|---|---|
| 声明式宏 | 模式匹配生成代码 | macro_rules! |
| 派生宏 | 自动实现trait | #[derive(MyTrait)] |
| 属性宏 | 修改函数/结构体 | #[my_attribute] |
练习提示
编写一个calculate!宏,支持calculate!(a + b)和calculate!(a * b)两种形式,分别返回和与积。