宏的变化

在 Rust 2018 中,您可以通过 use 语句从外部包中导入特定的宏,而不是旧的 #[macro_use] 属性。
举个例子,考虑 bar 包中实现了一个 !bar 宏,在 src/lib.rs 中:
1. #[macro_export]
2. macro_rules! baz {
3. () => ()
4. }
在你的包中,你可以这样写:
1. // Rust 2015
3. #[macro_use]
4. extern crate bar;
6. fn main() {
7. baz!();
8. }
现在你可以这样:
1. // Rust 2018
2. #![feature(rust_2018_preview)]
4. use bar::baz;
6. fn main() {
7. baz!();
8. }
这会使 macro_rules 宏更接近其他类型的项目。
程序宏
使用过程宏来派生特征时,您必须命名提供自定义派生的宏。 这通常与特征的名称相匹配,但请查阅提供派生的包的文档以确认。
举个例子,在 Serde 中,你可以这样写:
1. // Rust 2015
2. extern crate serde;
3. #[macro_use] extern crate serde_derive;
5. #[derive(Serialize, Deserialize)]
6. struct Bar;
现在你可以这样:
1. // Rust 2018
2. #![feature(rust_2018_preview)]
3. use serde_derive::{Serialize, Deserialize};
5. #[derive(Serialize, Deserialize)]
6. struct Bar;
更多细节:
这仅适用于外部包中定义的宏。 对于本地定义的宏,#[macro_use] mod foo; 还是需要的,如同 Rust 2015 一样。
