Rust 宏


分为:
  • 声明Declarative)宏,使用 macro_rules! // vec![1,2,3]
  • 过程Procedural),其有三种类型:
    • 自定义派生宏 #[derive(Debug)] // 只能用于结构体和枚举,解析成 AST 重写
    • 类属性宏 // #[route(GET, "/")],解析成 AST 重写,还能用于函数
    • 类函数宏 // sql!(SELECT * FROM posts WHERE id=1),解析成 AST 重写

从根本上来说,宏是一种为写其他代码而写代码的方式,即所谓的 元编程metaprogramming)。

过程宏接收 Rust 代码作为输入,在这些代码上进行操作,然后产生另一些代码作为输出,而非像声明式宏那样匹配对应模式然后以另一部分代码替换当前代码。

在调用宏 之前 必须定义并将其引入作用域,而函数则可以在任何地方定义和调用。

当属性作用于整个 crate 时,它们的语法为 #![crate_attribute] // 使用 cargo 这个就没啥用了
当它们用于模块或项时,语法为 #[item_attribute]
语法有多种形式:
  • #[attribute = "value"]
  • #[attribute(key = "value")]
  • #[attribute(value)]
--cfg some_condition 传递自定义条件

使用模块中的宏:为有宏的模块添加 #[macro_use] // 跨 create 时要为宏本身添加 #[macro_export]
// 宏始终位于 crate 的顶层