三种宏

  • 自定义 #[derive]
  • 属性行为(attribute-like)宏,Rust 属性宏解析
  • 函数行为(function-like)宏

实现元编程,代码生成代码,必须带入当前命名空间内才能使用(不能使用 mod::sub::macro! 这种方式调用)。

#[macro_export]
macro_rules! vec {
	( $($x:expr), *) => {           // $() 用于捕捉值,$x:expr 匹配 Rust 表达式并绑定到 $x,逗号(,)表明一个逗号可能出现在表达式后面,* 表明表达式匹配一次或多次
		{
			let mut temp_vec = Vec::new();
			${
				temp_vec.push($x);
			}*
			temp_vec
		}
	};
}

调用宏用于从属性生成代码

有点像编译期的装饰器:

use proc_macro;

#[some_attribute]
pub fn some_name(input: TokenStream) -> TokenStream {
	// --snip--
}