当使用Serialize和DeserializeOwned作为父trait时,无法解析`T: serde::Deserialize<'de>`。

4

我希望我的特性依赖于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> {}

(完整代码)

但是我遇到了这个错误:

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`

在这个上下文中,我不知道那是什么意思。我不明白它与关于 E0283 的信息有什么关联。

(根据Serde 生命期信息,我认为我需要 DeserializeOwned,但我找不到有关“扩展”特征的任何信息,所以我可能是错误的)。

1个回答

6
一般情况下,避免在 struct 上放置特质约束。相反,将这些约束放在需要这些约束的方法的 impl 块中:
#[derive(Serialize, Deserialize)]
pub struct MyStruct<T> {
    value: T,
}

impl<T> MyStruct<T> where T: MyTrait {
    fn do_stuff(&self) {
        ...
    }
}

对于structimpl块,约束条件的求解方式存在一些微妙的差异,但可以肯定的是它们是不同的,这种变化应该可以使您的代码按预期工作。


对我来说,这被称为“结构体上的特质边界”令人困惑。看起来边界是在特质MyTrait上...(实际上我偶然发现了那个讨论,但因为这个原因跳过了它)。 - Mark
1
@Mark,“结构体上的特质限定”实际上意味着“在结构体的类型参数上进行特质限定”。您对MyTrait施加的约束在这种情况下仍然可以正常工作。 - Peter Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接