我需要一个对项进行反序列化并将其设置为 struct 的函数.我需要一个将项设置为 struct 的函数,但该项可能不会实现DeserializeOwned. 我需要这样的东西:

    struct SomeStruct<T> {
      item: T,
    }
    
    impl<T> SomeStruct<T> {
      pub fn set_item_from_json<D: DeserializeOwned>(&mut self, json: String) {
        let item: D = serde_json::from_str(&json).unwrap();
        self.item = item;
      }

      pub fn set_item(&mut self, item: T) {
        self.item = item;
      }
    }

正如预期的那样,上面的代码不起作用,因为mismatched types [E0308] expected type parameter 'T', found type parameter 'D'发生在set_item_from_json中.我能做什么?

推荐答案

where子句可以约束现有的泛型参数:

pub fn set_item_from_json(&mut self, json: String)
where
    T: DeserializeOwned,
{
    let item = serde_json::from_str(&json).unwrap();
    self.item = item;
}

或者,将其放在impl:

impl<T: DeserializeOwned> SomeStruct<T> {
    pub fn set_item_from_json(&mut self, json: String) {
        let item = serde_json::from_str(&json).unwrap();
        self.item = item;
    }
}

impl<T> SomeStruct<T> {
    pub fn set_item(&mut self, item: T) {
        self.item = item;
    }
}

Rust相关问答推荐

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

返回的future 不是`发送`

为什么这是&q;,而让&q;循环是无限循环?

使用极点数据帧时,找不到枚举结果的方法lazy()

`Pin`有没有不涉及不安全代码的目的?

在macro_rule中拆分模块和函数名

从 rust 函数返回 &HashMap

更新 rust ndarray 中矩阵的一行

为什么Rust中无法推断生命周期?

使用 lalrpop 在 rust 中解析由 " 引用的字符串

哪些特征通过 `Deref` 而哪些不通过?

特征中定义的类型与一般定义的类型之间的区别

从现有系列和 map 值创建新系列

RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象

在 RefCell 上borrow

匹配结果时的简洁日志(log)记录

深度嵌套枚举的清洁匹配臂

TinyVec 如何与 Vec 大小相同?

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?

为什么-x试图解析为文字并在声明性宏中失败?