宏的变化

Minimum Rust version: nightly

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

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


#![allow(unused)]
fn main() {
#[macro_export]
macro_rules! baz {
    () => ()
}
}

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

// Rust 2015

#[macro_use]
extern crate bar;

fn main() {
    baz!();
}

现在你可以这样:

// Rust 2018
#![feature(rust_2018_preview)]

use bar::baz;

fn main() {
    baz!();
}

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

程序宏

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

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

// Rust 2015
extern crate serde;
#[macro_use] extern crate serde_derive;

#[derive(Serialize, Deserialize)]
struct Bar;

现在你可以这样:

// Rust 2018
#![feature(rust_2018_preview)]
use serde_derive::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Bar;

更多细节:

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