如何使用需要实现者实现的方法创建特征 serde::Deserialize
How to create a trait with a method that requires the implementors to implement serde::Deserialize
我有一些使用 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
我怎样才能让它工作?
将 Deserialize
替换为 DeserializeOwned
- 这允许您摆脱显式生命周期 'de
:
trait FromTomlFile
where
Self: Sized + serde::de::DeserializeOwned,
// etc
我有一些使用 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
我怎样才能让它工作?
将 Deserialize
替换为 DeserializeOwned
- 这允许您摆脱显式生命周期 'de
:
trait FromTomlFile
where
Self: Sized + serde::de::DeserializeOwned,
// etc