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

时间:2017-02-04 22:25:07

标签: rust

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

#[derive(Eq, PartialEq, Serialize)]
struct MyStruct {
    a: u8,
    b: u8
}

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

error: '#[derive]' for custom traits is not stable enough for use. It is deprecated and will be removed in v1.15 (see issue #29644)

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

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

1 个答案:

答案 0 :(得分:4)

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

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

fn main() {
    println!("{:?}", Foo);
}

这样,cargo run将无法编译,因为Debug未实现Foo,但cargo run --features example将成功编译并运行。