我有一个包含20个字段的 struct :

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

我想用Default分换StructA分.我试图向 struct 中添加#[derive(Default)],但chrono::NaiveDate没有实现Default.

然后我try 用DefaultStructA:

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),
        }
    }
}

这段代码运行良好,但value1value19的部分是多余的.有没有代码更少的解决方案?

  • 我定义了StructA来通过serde JSON反序列化JSON数据,因此无法更改 struct 的定义.
  • JSON数据总是给出day: chrono::NaiveDate的值,所以我想避免使用day: Option<chrono::NaiveDate>.

推荐答案

derivative crate 让这种事情变得轻而易举:

#[derive(Derivative)]
#[derivative(Default)]
struct StructA {
    value1: i32,
    value2: i32,
    // ...
    value19: i32,
    #[derivative(Default(value = "NaiveDate::from_ymd(2021, 1, 1)"))]
    day: NaiveDate,
}

如果你想避免使用外部 crate ,你可以 Select :

  • 您已经使用的方法,缺点是必须命名所有字段.还请注意,您不需要 for each 数字字段重复Default::default()次,简单的0也可以.
  • day设为Option,然后导出Default,缺点是它将默认为None,并承担运行时成本,您必须使用unwrap()才能访问它.
  • day设为一个新类型,包装NaiveDate并实现Default以将其设置为所需的值,缺点是需要通过(零成本)字段或方法访问NaiveDate.

Rust相关问答推荐

如何在 struct 中填充缓冲区并同时显示它?

有条件默认实现

是否可以为`T:Copy`执行`T. clone`的测试

如何在Rust中实现Functor trait?

无法从流中读取Redis请求

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

允许 rust 迹 struct 条目具有多种类型

Rust面向对象设计模式

为相同特征的特征对象使用 move 方法实现特征

如何对一个特征的两个实现进行单元测试?

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

Rust LinkedList 中的borrow 判断器错误的原因是什么?

std mpsc 发送者通道在闭包中使用时关闭

当没有实际结果时,如何在 Rust 中强制执行错误处理?

OpenGL 如何同时渲染无纹理的四边形和有纹理的四边形

Rust编译器通过哪些规则来确保锁被释放?

第 7.4 章片段中如何定义 `thread_rng`

如何在 Rust 中编写修改 struct 的函数

有没有办法阻止 rust-analyzer 使非活动代码变暗?