rust中的宏分为两类:
- 声明宏
过程宏
- 派生宏 #[derive]
- 类属性宏
- 类函数宏
宏和函数的区别
函数是某些数理逻辑的抽象,是具体的代码。
宏是编写代码的工具。也叫元编程。宏具有更高的抽象。声明宏
#[macro_export]
当宏所在的包被使用时,自动将宏导入。#[macro_use]
从模块中导出宏。将宏的可见性扩大。
第一行已说明。#[macro_export]
macro_rules! vec_new {
($($x:expr), *) => {
{
let mut tmp_vec = Vec::new();
$(
tmp_vec.push($x);
)*
tmp_vec
}
};
}
第二行中macro_rules! vec_new{}是宏声明的基本格式。vec_new代表的是宏名称。注意使用的时候要在名称后面接!。
第三行后面的内容是模式。宏中可以有多个模式。这里只有一个。
模式中以=>作为分界线。前面的是匹配结构,后面的是代码块。匹配结构
特殊:空匹配。
标准的匹配结构:
可选的种类:$标识符:种类
item 函数,结构体,模块。
- block 块,由大括号括起来的内容。
- stmt a statement.
- pat 模式。
- ty 类型。
- ident 标识符。
- path 路径
- meta ??
- tt 词法树。
结构的可重复性:
通过使用$()将结构包裹,在添上sep 分割符,rep 次数限定。
sep: , ;
rep : * + ?过程宏
过程宏接受某些代码作为输入,对该代码进行操作,并生成一些代码作为输出。
宏的编写准则
- 将宏规则从最具体到最不具体编写
- 注意宏使用的上下文。