使用 Serialize 和 DeserializeOwned 作为超级特征时无法解析“T: serde::Deserialize<'de>”
Cannot resolve `T: serde::Deserialize<'de>` when using Serialize and DeserializeOwned as supertraits
我希望我的特性取决于 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`
我不知道在这种情况下这意味着什么。我不明白它与 info about E0283.
有什么关系
(我 认为 DeserializeOwned
是我想要的,基于 Serde lifetimes info,但我在 "extending" 上找不到任何东西特质,所以我可能是错的)。
一般来说,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) {
...
}
}
struct
与 impl
块的约束解决方式的差异有点微妙,但足以说明它是不同的,并且此更改应该使您的代码按预期工作。
我希望我的特性取决于 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`
我不知道在这种情况下这意味着什么。我不明白它与 info about E0283.
有什么关系(我 认为 DeserializeOwned
是我想要的,基于 Serde lifetimes info,但我在 "extending" 上找不到任何东西特质,所以我可能是错的)。
一般来说,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) {
...
}
}
struct
与 impl
块的约束解决方式的差异有点微妙,但足以说明它是不同的,并且此更改应该使您的代码按预期工作。