我最近开始使用 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 的东西,但无济于事。
有没有一种优雅的方法来避免代码重复?
您可以引入一个新的中间特征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)