Rust宏详解之类函数宏

文章目录

    • 过程宏
    • 类函数宏
    • 调用与测试

Rust基础教程:初步⚙所有权⚙结构体和枚举类⚙函数进阶⚙泛型和特征⚙并发和线程通信⚙cargo包管理
Rust进阶教程:用宏实现参数可变的函数

过程宏

在Rust中,macro_rules!是最常用的宏,也叫声明式宏。

除了这种最基础的宏之外,Rust还支持三种过程宏

  • 类函数宏(Function-like macro),看上去就像是函数调用
  • 类属性宏(Attribute-like macro),用于为目标添加自定义的属性
  • 派生宏 #[derive],可以为目标结构体或枚举派生指定的代码,例如 Debug 特征

过程宏和声明宏有一个重要区别,即过程宏首先是一个库,需要在其配置文件中说明,下面用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的输出。

你可能感兴趣的:(Rust,rust,开发语言,后端)