首页 > 解决方案 > 对于具有未实现默认值的字段的结构,是否有一种简短的方法来实现默认值?

问题描述

我有一个有 20 个字段的结构:

struct StructA {
    value1: i32,
    value2: i32,
    // ...
    value19: i32,
    day: chrono::NaiveDate,
}

我想DefaultStructA. 我试图添加#[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),
        }
    }
}

这段代码工作正常,但是value1through的部分value19是多余的。有没有更少代码的解决方案?

标签: rust

解决方案


衍生板条箱使这种事情变得轻而易举:

#[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 dayanOption和 derived Default,它的缺点是默认为None,承担运行时成本,您必须unwrap()访问它。
  • 创建day一个包装NaiveDate并实现Default的新类型以将其设置为所需的值,缺点是您需要NaiveDate通过(零成本)字段或方法访问。

推荐阅读