rust - 对于具有未实现默认值的字段的结构,是否有一种简短的方法来实现默认值?
问题描述
我有一个有 20 个字段的结构:
struct StructA {
value1: i32,
value2: i32,
// ...
value19: i32,
day: chrono::NaiveDate,
}
我想Default
为StructA
. 我试图添加#[derive(Default)]
到结构中,但chrono::NaiveDate
没有实现Default
.
然后我尝试Default
实现StructA
:
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
through的部分value19
是多余的。有没有更少代码的解决方案?
- 我定义
StructA
通过 serde-json 反序列化 JSON 数据,所以我不能更改结构的定义。 - 的值
day: chrono::NaiveDate
总是从 JSON 数据中给出,所以我想避免day: Option<chrono::NaiveDate>
.
解决方案
衍生板条箱使这种事情变得轻而易举:
#[derive(Derivative)]
#[derivative(Default)]
struct StructA {
value1: i32,
value2: i32,
// ...
value19: i32,
#[derivative(Default(value = "NaiveDate::from_ymd(2021, 1, 1)"))]
day: NaiveDate,
}
如果您想避免使用外部包装箱,您的选择是:
- 您已经使用的方法,缺点是您必须命名所有字段。另请注意,您不需要
Default::default()
为每个数字字段重复,一个简单0
的也可以。 - make
day
anOption
和 derivedDefault
,它的缺点是默认为None
,承担运行时成本,您必须unwrap()
访问它。 - 创建
day
一个包装NaiveDate
并实现Default
的新类型以将其设置为所需的值,缺点是您需要NaiveDate
通过(零成本)字段或方法访问。
推荐阅读
- react-native - 运行 react-native run-android 时出错:“无法加载脚本”
- reactjs - React 包没有从节点模块加载
- c# - 如何仅检测最新更改的数据行以拒绝更改?
- scala - 为什么ScalaTest在匹配时默认不强制类型?
- java - firebase 数据库的权限被拒绝
- javascript - Qt QWebEngineView 在发布中但在调试中找不到 javascript 文件
- jquery - Web方法中的jQuery if语句
- java - 找不到参数的方法 compileOptions()
- python - 可扩展性问题数据透视表 Pandas/Numpy
- c++ - 为什么当我在复制构造函数中添加一个作为参数的不同对象时调用复制构造函数?