Rust - 特征取决于功能?

Par*_*oxa 9 traits rust

我最近开始使用 Rust 并正在开发一个库。以下有效,但看起来像是代码重复

#[cfg(feature = "serde_support")]
use serde::Serialize;

#[cfg(not(feature = "serde_support"))]
pub struct Teststruct<T>
{

    graph: T
}

#[cfg(feature = "serde_support")]
#[derive(Serialize)]
pub struct Teststruct<T>
where T: Serialize
{
    graph: T
}
Run Code Online (Sandbox Code Playgroud)

请注意,虽然where T: Serialize本例中并不严格要求特征绑定,但在我当前面临的问题中却是必需的。

因此,上面的内容对我来说看起来像是不必要的代码重复,特别是当结构包含更多字段时。我宁愿写这样的东西:

#[cfg(feature = "serde_support")]
use serde::Serialize;

#[cfg_attr(feature = "serde_support", derive(Serialize))]
pub struct Teststruct<T: Node>
where T: Serialize,
      Graph<T>: Serialize + DeserializeOwned
{

    graph: Graph<T>
}
Run Code Online (Sandbox Code Playgroud)

然而,现在我只能使用“serde_support”功能进行编译 - 如果没有该功能,我显然会收到错误:Serialize在此范围内找不到。

我试图为特征绑定找到类似 cfg_attr 的东西,但无济于事。

有没有一种优雅的方法来避免代码重复?

phi*_*mue 8

您可以引入一个新的中间特征MySerialize,以便您始终需要MySerialize而不是Serialize,从而仅在一个地方进行此切换。

推导可以通过 求解cfg_attr

#[cfg(feature = "serde_support")]
use serde::Serialize;

#[cfg(feature = "serde_support")]
pub trait MySerialize : Serialize {}

#[cfg(not(feature = "serde_support"))]
pub trait MySerialize {}

#[cfg_attr(feature = "serde_support", derive(Serialize))]
pub struct Teststruct<T>
    where T: MySerialize
{
    graph: T
}
Run Code Online (Sandbox Code Playgroud)