【问题标题】:How to create a trait with a method that requires the implementors to implement serde::Deserialize [duplicate]如何使用需要实现者实现 serde::Deserialize 的方法创建特征 [重复]
【发布时间】:2019-07-24 22:47:35
【问题描述】:

Playground link

我有一些使用from_path() 方法从 TOML 文件反序列化的结构。为了防止复制代码,我尝试使用通用方法创建一个特征来执行此操作,我可以像这样实现

impl FromTomlFile for MyStruct {}

不幸的是,由于 serde::Deserialize 上的生命周期参数,这并不像我想象的那么简单。

use serde;
use serde_derive::Deserialize; // 1.0.88
use std::fs;
use std::path::Path;
use toml; // 0.4.10

#[derive(Deserialize)]
struct A {}

trait FromTomlFile<'de>
where
    Self: Sized + serde::Deserialize<'de>,
{
    fn from_path<P: AsRef<Path>>(path: P) -> Result<Self, toml::de::Error> {
        toml::from_str(&String::from_utf8_lossy(&fs::read(&path).unwrap()))
    }
}

impl FromTomlFile for A {} // <-- doesn't work

我怎样才能让它工作?

【问题讨论】:

    标签: serialization rust lifetime serde


    【解决方案1】:

    Deserialize 替换为DeserializeOwned - 这可以让您摆脱显式生命周期'de

    trait FromTomlFile
    where
        Self: Sized + serde::de::DeserializeOwned,
    // etc
    

    【讨论】:

      猜你喜欢
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多