rust 要求"德“必须比”阿“活得长

pgccezyw  于 10个月前  发布在  其他
关注(0)|答案(1)|浏览(122)

我一直在尝试实现一个结构体的序列化和序列化特征。我只是沿着编译器告诉我的路线走下去,然后卡住了。
我从这个struct开始:

#[derive(Serialize, Deserialize)]
struct FileMetadata {
  file_path: PathBuf,
  last_updated: SystemTime,
  mime_type: MediaType,
}

字符串
并得到以下错误:expected named lifetime parameter, help: consider introducing a named lifetime parameter.
所以我这样做:

#[derive(Serialize, Deserialize)]
struct FileMetadata<'a> {
  file_path: PathBuf,
  last_updated: SystemTime,
  mime_type: MediaType<'a>,
}


这给出了以下错误:requires that 'de must outlive' a , help: consider adding the following bound: 'de: 'a
所以我照它说的做:

#[derive(Serialize, Deserialize)]
struct FileMetadata<'a, 'de>
where
'de: 'a {
  file_path: PathBuf,
  last_updated: SystemTime,
  mime_type: MediaType<'a>,
}


现在我有两个错误:

  1. cannot deserialize when there is a lifetime parameter called 'de
  2. unused parameter, help: consider removing 'de , referring to it in a field, or using a marker such as PhantomData.
    我也试着遵循this post的建议,但这是同一条路。
    我可以解决第二个错误,但不能解决第一个。我发现这个错误非常令人沮丧,因为编译器把我送上了一条路,最后给了我一个相当于"计算机说不"的错误。我在这里错过了什么,有人能解释我哪里出错了,以及我如何在未来避免这类问题。
xu3bshqb

xu3bshqb1#

这是mediatype crate的0.19.15版本中的一个bug。参见https://github.com/picoHz/mediatype/pull/15
你可以像这样处理它:

// [dependencies]
// mediatype = "0.19"
// serde = "1"
// serde_derive = "1"

use mediatype::MediaType;
use serde::de::{Deserialize, Deserializer};
use serde_derive::Deserialize;
use std::path::PathBuf;
use std::time::SystemTime;

#[derive(Deserialize)]
pub struct FileMetadata<'a> {
    pub file_path: PathBuf,
    pub last_updated: SystemTime,
    #[serde(borrow, deserialize_with = "mediatype_workaround")]
    pub mediatype: MediaType<'a>,
}

fn mediatype_workaround<'de: 'a, 'a, D>(deserializer: D) -> Result<MediaType<'a>, D::Error>
where
    D: Deserializer<'de>,
{
    let s: &str = Deserialize::deserialize(deserializer)?;
    MediaType::parse(s).map_err(serde::de::Error::custom)
}

字符串

相关问题