我希望我的特质取决于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的关系。
(我认为基于Serde lifetimes info,我想要DeserializeOwned
,但是由于“扩展”特征我什么都找不到,所以我可能错了)。
答案 0 :(得分:3)
通常为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
块的约束求解方式上的差异有些微妙,但可以说是不同的,这种改变应可使您的代码按预期工作。