gpt4 book ai didi

Rust - 特征绑定(bind)取决于特征?

转载 作者:行者123 更新时间:2023-12-03 11:24:55 25 4
gpt4 key购买 nike

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

请注意,虽然特征绑定(bind) 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在此范围内找不到。

我试图为特征绑定(bind)找到类似 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
}

关于Rust - 特征绑定(bind)取决于特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61392550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com