学习rust有三大难点,所有权、生命周期、宏。一段时间学习下来感觉所有权还好整一点,生命周期和宏学习是真的离谱。下面简单梳理记录下rust中宏的学习和使用。
rust中宏有两大类:声明宏 和 过程宏,然后过程宏又分为三小类——Funtion-like macros、Derive macraos、Attribute macros.
声明宏(macro_rules!)的使用
声明宏类似于match关键字的使用。在macro_rules!内,可定义多种匹配模式,之后根据匹配模式输出对应的代码。
声明宏的使用:
过程宏可获取与其关联的TokenStream然后生成新的TokenStream。共有三种形式:
- Function-like macros(函数式宏),使用#[proc_macro]属性声明,类似于声明宏,但比声明宏更为强大。
- Derive macros(派生宏),使用#[proc_macro_derive(xxx)]属性声明,可用于struct、enum、union。
- Attribue macro(属性宏),使用#[proc_macro_attribute]属性声明,可用于function、struct、enum、union。与派生宏不同的是,属性宏使用时可以获取到属性内添加的参数,见示例 #[route(GET,"/index")] ,其中 GET、”index”都可被获取到。同时也可以获取到与其关联的函数或者结构体或者enum或者union的信息,然后生成新的TokenStream。
过程宏的使用
- - custom!(...)
- - #[derive(CustomDerive)]
- - #[CustomAttribute]
因为过程宏无法直接放在main的crate包内运行,所以我们需要在项目中里面建一个lib包,然后通过main.rs来引入该lib包进行测试。
命令行执行以下命令:
创建完成后我们的目录长这样:
目录创建完成之后我们需要在 test_macro_pro/sample/Cargo.toml 里面添加以输出包含macro的lib包:
过程宏的使用:
Function-like macros:
Derive macros:
因为会使用到quote、syn,所以需要在test_macro_pro/sample/Cargo.toml里面声明,如下:
测试代码如下:
Attribue macro:

文章评论