【发布时间】:2021-09-21 13:11:10
【问题描述】:
我有一个包含 20 个字段的结构:
struct StructA {
value1: i32,
value2: i32,
// ...
value19: i32,
day: chrono::NaiveDate,
}
我想为StructA 实现Default 特征。我尝试将#[derive(Default)] 添加到结构中,但chrono::NaiveDate 没有实现Default。
然后我尝试为StructA 实现Default:
impl Default for StructA {
fn default() -> Self {
Self {
value1: Default::default(),
value2: Default::default(),
// ...
value19: Default::default(),
day: chrono::NaiveDate::from_ymd(2021, 1, 1),
}
}
}
这段代码运行良好,但value1 到value19 的部分是多余的。有没有代码更少的解决方案?
- 我定义了
StructA以通过 serde-json 反序列化 JSON 数据,因此我无法更改结构的定义。 -
day: chrono::NaiveDate的值始终来自 JSON 数据,因此我想避免使用day: Option<chrono::NaiveDate>。
【问题讨论】:
-
我更喜欢管理较小的结构,也可以应用内部模式:play.rust-lang.org/…
-
@ÖmerErden 是的。您的评论是更好的方法。但现在,我定义了用于序列化/反序列化现有 JSON 数据的 StructA。所以我不能改变 StructA 的结构。
-
您始终可以实现自定义序列化器/反序列化器来以不同的结构表示您的数据,实际上如果您使用 serde
#[serde(flatten)]可以轻松解决内部模式的问题。 -
我不知道
#[serde(flatten)]。谢谢。
标签: rust