基于特征标志有条件地派生

w.b*_*ian 7 rust

我想在我的 crate 中添加一个功能,可以选择使某些结构可序列化,特别是,我想使用 Serde 的自定义派生宏。Serde 依赖项是可选的,extern crate并且有条件地包含在功能后面的声明。考虑以下:

#[derive(Eq, PartialEq, Serialize)]
struct MyStruct {
    a: u8,
    b: u8
}
Run Code Online (Sandbox Code Playgroud)

启用功能标志后,一切正常。禁用它后,我收到此警告:

#[derive(Eq, PartialEq, Serialize)]
struct MyStruct {
    a: u8,
    b: u8
}
Run Code Online (Sandbox Code Playgroud)

有没有办法有条件地包含派生特征?我正在使用 Rust 1.15 稳定版。

我应该为错误消息提交问题吗?它似乎具有误导性。

She*_*ter 11

像许多其他基于特征的条件编译一样,使用cfg_attr

#[cfg_attr(feature = "example", derive(Debug))]
struct Foo;

fn main() {
    println!("{:?}", Foo);
}
Run Code Online (Sandbox Code Playgroud)

有了这个,cargo run将无法编译,因为Debug没有为 实现Foo,但cargo run --features example会编译并成功运行。