【问题标题】:Cannot resolve `T: serde::Deserialize<'de>` when using Serialize and DeserializeOwned as supertraits使用 Serialize 和 DeserializeOwned 作为超特征时无法解析 `T: serde::Deserialize<'de>`
【发布时间】:2018-07-22 23:36:26
【问题描述】:

我希望我的特质依赖于 Serde:

pub trait MyTrait: Serialize + DeserializeOwned {}

#[derive(Serialize, Deserialize)]
pub struct MyStruct<T: MyTrait> {
    value: T,
}

impl MyTrait for i32 {}
impl MyTrait for MyStruct<i32> {}

(full code)

但我收到此错误:

error[E0283]: type annotations required: cannot resolve `T: serde::Deserialize<'de>`
  --> src/main.rs:11:21
   |
11 | #[derive(Serialize, Deserialize)]
   |                     ^^^^^^^^^^^
   |
   = note: required by `serde::Deserialize`

我不知道在这种情况下这意味着什么。我不明白它与info about E0283 有何关系。

(我认为 DeserializeOwned 是我想要的基于Serde lifetimes info 的东西,但我找不到任何关于“扩展”特征的东西,所以我可能错了)。

【问题讨论】:

    标签: rust traits serde


    【解决方案1】:

    一般来说,avoid putting trait bounds on a struct。相反,将边界放在 impl 块上,用于需要这些边界的方法:

    #[derive(Serialize, Deserialize)]
    pub struct MyStruct<T> {
        value: T,
    }
    
    impl<T> MyStruct<T> where T: MyTrait {
        fn do_stuff(&self) {
            ...
        }
    }
    

    structimpl 块的约束解决方式的差异有点微妙,但可以说它是不同的,这种变化应该使您的代码按预期工作。

    【讨论】:

    • 这被称为“结构上的特征界限”让我感到困惑。看起来界限在 trait MyTrait...(实际上我偶然发现了那个讨论,但出于这个原因跳过了它)。
    • @Mark “结构上的特征边界”实际上是指“结构的类型参数上的特征边界”。在这种情况下,您对 MyTrait 施加的约束应该仍然可以正常工作。
    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2019-11-03
    • 2020-06-18
    • 2021-01-01
    • 2019-07-24
    • 2023-02-20
    • 1970-01-01
    • 2019-05-22
    相关资源
    最近更新 更多