我正在尝试编写一个派生的结构,serde::Deserialize但它也有一个应该派生的字段serde::Deserialize:
extern crate serde;
#[macro_use]
extern crate serde_derive;
use serde::{Deserialize, Serialize};
#[derive(PartialEq, Serialize, Deserialize)]
pub struct Record<'a, T>
where
T: 'a + Serialize + Deserialize<'a>,
{
id: &'a str,
created_at: &'a str,
created_by: Option<&'a str>,
last_updated_at: Option<&'a str>,
object: &'a T,
}
impl<'a, T> Record<'a, T>
where
T: 'a + Serialize + Deserialize<'a>,
{
pub fn new(
id: &'a str,
created_at: &'a str,
created_by: Option<&'a str>,
last_updated_at: Option<&'a str>,
object: &'a T,
) -> Self {
Record {
id,
created_at,
created_by,
last_updated_at,
object,
}
}
}
fn main() {}
Run Code Online (Sandbox Code Playgroud)
我一直在更改代码一段时间,但我无法编译这个想法。我现在得到的错误是:
extern crate serde;
#[macro_use]
extern crate serde_derive;
use serde::{Deserialize, Serialize};
#[derive(PartialEq, Serialize, Deserialize)]
pub struct Record<'a, T>
where
T: 'a + Serialize + Deserialize<'a>,
{
id: &'a str,
created_at: &'a str,
created_by: Option<&'a str>,
last_updated_at: Option<&'a str>,
object: &'a T,
}
impl<'a, T> Record<'a, T>
where
T: 'a + Serialize + Deserialize<'a>,
{
pub fn new(
id: &'a str,
created_at: &'a str,
created_by: Option<&'a str>,
last_updated_at: Option<&'a str>,
object: &'a T,
) -> Self {
Record {
id,
created_at,
created_by,
last_updated_at,
object,
}
}
}
fn main() {}
Run Code Online (Sandbox Code Playgroud)
通常,您不应在 structs 上编写 Serde 特征边界。
rustc --explain E0283 解释你的问题:
当编译器没有足够的信息来明确选择实现时会发生此错误
我发现#[serde(bound()]用于声明边界使示例编译:
#[derive(PartialEq, Serialize, Deserialize)]
pub struct Record<'a, T: 'a> {
id: &'a str,
created_at: &'a str,
created_by: Option<&'a str>,
last_updated_at: Option<&'a str>,
#[serde(bound(deserialize = "&'a T: Deserialize<'de>"))]
object: &'a T,
}
Run Code Online (Sandbox Code Playgroud)
作为另一种解决方案,因为T是通用的并且可能是参考,请考虑更改Record定义,以便 Serde 不需要更明确的指示:
#[derive(PartialEq, Serialize, Deserialize)]
pub struct Record<'a, T: 'a> {
id: &'a str,
created_at: &'a str,
created_by: Option<&'a str>,
last_updated_at: Option<&'a str>,
object: T,
}
impl<'a, T: 'a> Record<'a, T> {
pub fn new(
id: &'a str,
created_at: &'a str,
created_by: Option<&'a str>,
last_updated_at: Option<&'a str>,
object: T,
) -> Self {
Record {
id,
created_at,
created_by,
last_updated_at,
object,
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1058 次 |
| 最近记录: |