Rust的宏有两种类型:声明式和程序式。声明式的宏很像C语言的宏,而过程式的宏很像Java有反射加持的AOP。
而程序式根据作用的位置(顶在谁头上)不同,分成自定义derive
,函数
,属性
三种。
在当前目录下创建三个工程:
crate new use_demo
crate new --lib hello_macro
crate new --lib hello_macro_derive
hello_macro包
lib.rs:
pub trait HelloMacro {`在这里插入代码片`
fn hello_macro();
}
hello_macro_derive包
lib.rs:
extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn;
#[proc_macro_derive(HelloMacro)]
pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
// Construct a representation of Rust code as a syntax tree
// that we can manipulate
let ast = syn::parse(input).unwrap();
// Build the trait implementation
impl_hello_macro(&ast)
}
fn impl_hello_macro(ast: &syn::Deri