Rust - trait bound depending on feature?

问题描述 投票:3回答:1

我最近开始使用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
}

请注意,虽然性状约束 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>
}

然而现在,我只能用 "serde_support "这个特性来编译--如果没有这个特性,我显然会得到这样的错误。Serialize is not found in this scope.

我试着为特性绑定找到类似cfg_attr的东西,但没有用。

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

rust traits
1个回答
3
投票

你可以引入一个新的中间特性 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
}
© www.soinside.com 2019 - 2024. All rights reserved.