Rust:如何为具有泛型类型的结构派生反序列化?

问题描述

#[derive(Deserialize)]
struct S<'d,T>
  where T: Deserialize<'d>
{
  foo: T,other_field: String
}

上面的代码编译失败,抱怨未使用的生命周期参数, 但如果我删除它,Deserialize 将失去生命周期。

不使用幻象标记DeserializeOwned可以使上述代码正确吗?

解决方法

如果您完全删除 where 子句,则代码有效。派生将自动为派生的 T: Deserialize<'de> 实现添加一个 Deserialize<'de> 绑定。

#[derive(Deserialize)]
struct S<T> {
  foo: T,other_field: String
}

对于 Rust,通常不会在 struct/enum 声明中限制泛型类型。泛型类型仅适用于需要行为的 impl 块。