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元编程的核心工具,但应谨慎使用——能用函数解决的不用宏。