Macro 宏

从调用上看,最显著的是,宏多了一个 !,如 println!("aaa");

宏的参数

宏的参数可以使用 ()[] 以及 {} :

1
2
3
4
5
fn main() {
println!("aaaa");
println!["aaaa"];
println!{"aaaa"}
}

虽然三种使用形式皆可,但是 Rust 内置的宏都有自己约定俗成的使用方式,例如 vec![...]assert_eq!(...) 等。

参数数量:函数的参数数量是固定的,而宏就可以拥有可变数量的参数。如 println!("hello") ,也可以调用两个参数的 println!("hello {}", name)

宏的分类

在 Rust 中宏分为两大类:声明式宏( declarative macros ) macro_rules! 和三种过程宏( procedural macros ):

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

声明式宏 macro_rules!