宏的变化
在 Rust 2018 中,您可以通过 use
语句从外部包中导入特定的宏,而不是旧的 #[macro_use]
属性。
举个例子,考虑 bar
包中实现了一个 !bar
宏,在 src/lib.rs
中:
#![allow(unused_variables)] 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 一样。