Rust宏编程:声明宏与过程宏详解
3 阅读
预计 3 分钟
Rust的宏系统比其他语言的宏更安全、更强大。本文详解声明宏和过程宏。
## 声明宏(macro_rules!)
```rust
macro_rules! vec_macro {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
}
let v = vec_macro![1, 2, 3];
```
## 常用声明宏模式
```rust
macro_rules! map {
($( $key:expr => $value:expr ),*) => {{
let mut m = std::collections::HashMap::new();
$( m.insert($key, $value); )*
m
}};
}
```
## 过程宏
### 派生宏
```rust
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};
#[proc_macro_derive(HelloMacro)]
pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
let name = &ast.ident;
let gen = quote! {
impl HelloMacro for #name {
fn hello_macro() {
println!("Hello, Macro! My name is {}!", stringify!(#name));
}
}
};
gen.into()
}
```
### 属性宏与函数式宏
```rust
#[proc_macro_attribute]
pub fn timed(_attr: TokenStream, item: TokenStream) -> TokenStream {
// 为函数添加计时逻辑
}
#[proc_macro]
pub fn sql(input: TokenStream) -> TokenStream {
// 编译期SQL验证
}
```
宏是Rust元编程的核心工具,但应谨慎使用——能用函数解决的不用宏。
0 条评论 欢迎参与讨论