宏的变化

Minimum Rust version: nightly

在 Rust 2018 中,您可以通过 use 语句从外部包中导入特定的宏,而不是旧的 #[macro_use] 属性。

举个例子,考虑 bar 包中实现了一个 !bar 宏,在 src/lib.rs 中:

  1. #[macro_export]
  2. macro_rules! baz {
  3. () => ()
  4. }

在你的包中,你可以这样写:

  1. // Rust 2015
  2. #[macro_use]
  3. extern crate bar;
  4. fn main() {
  5. baz!();
  6. }

现在你可以这样:

  1. // Rust 2018
  2. #![feature(rust_2018_preview)]
  3. use bar::baz;
  4. fn main() {
  5. baz!();
  6. }

这会使 macro_rules 宏更接近其他类型的项目。

程序宏

使用过程宏来派生特征时,您必须命名提供自定义派生的宏。 这通常与特征的名称相匹配,但请查阅提供派生的包的文档以确认。

举个例子,在 Serde 中,你可以这样写:

  1. // Rust 2015
  2. extern crate serde;
  3. #[macro_use] extern crate serde_derive;
  4. #[derive(Serialize, Deserialize)]
  5. struct Bar;

现在你可以这样:

  1. // Rust 2018
  2. #![feature(rust_2018_preview)]
  3. use serde_derive::{Serialize, Deserialize};
  4. #[derive(Serialize, Deserialize)]
  5. struct Bar;

更多细节:

这仅适用于外部包中定义的宏。 对于本地定义的宏,#[macro_use] mod foo; 还是需要的,如同 Rust 2015 一样。