Rust基础教程:初步⚙所有权⚙结构体和枚举类⚙函数进阶⚙泛型和特征⚙并发和线程通信⚙cargo包管理
Rust进阶教程:用宏实现参数可变的函数
在Rust中,macro_rules!是最常用的宏,也叫声明式宏。
除了这种最基础的宏之外,Rust还支持三种过程宏
过程宏和声明宏有一个重要区别,即过程宏首先是一个库,需要在其配置文件中说明,下面用cargo创建一个新的项目
cargo new --lib marco
进入文件夹后,在其配置文件结尾添加
[lib]
proc-macro = true
下面在lib.rs中实现一个简单的类函数宏,内容如下
#![crate_type = "proc-macro"]
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro]
pub fn make_mod(n: TokenStream) -> TokenStream {
let output = format!("|x|{{x}} % {}", n);
output.parse().unwrap()
}
其中,#[proc_macro]下面就是我们定义的类函数宏,其语法结构也像是一个函数结构,输入和输出均为TokenStream类型。
函数内部,第一行用输入的n,拼接成一条符合Rust语法的字符串,即如下式
|x|{x%n}
第二行,将这个表达式转换为一个可执行的语句,再行输出。
接下来,新建一个测试项目
cargo new --bin marco_test
在其配置文件的依赖项后面添加宏包的路径
[dependencies]
marco = { path = "../marco" }
最后在main.rs中调用
extern crate marco;
use marco::make_mod;
fn main() {
let mod3 = make_mod!(3);
println!("{}", mod3(5));
}
主函数中也包含两行,第一行是调用宏生成一个函数,结合前面的代码,可知这个函数就是
|x|{x % 3}
这个函数的作用,就是求一个数除以 3 3 3之后的余数。
接下来,调用 mod 3 \operatorname{mod}3 mod3,得到 5 % 3 = 2 5\%3=2 5%3=2的输出。