添加使用默认字段值作为 serde 默认值的方式
作者: DarkFenX创建于 2026年7月20日更新于 2026年7月20日
#![feature(default_field_values)]
#[derive(serde::Deserialize)]
struct S1 {
tag: i8,
data: Vec<i8> = Vec::new(),
}
#[derive(serde::Deserialize)]
struct S2 {
#[serde(default)]
field1: S1 = S1 { tag: 2, .. },
}
这个代码会出现以下错误:error[E0277]: 类型约束 S1: Default 未满足
--> core_lib/src/lib.rs:11:5
|
11 | / #[serde(default)]
12 | | field1: S1 = S1 { tag: 2, .. },
| |__________________________________^ 类型 Default 未实现 S1
|
help: 可以考虑为 S1 { tag: 2, .. } 标记 #[derive(Default)]
|
4 + #[derive(Default)]
5 | struct S1 {
|
如果能让 serde 使用 `S1 { tag: 2, .. }` 作为 S2.field1 的默认值,而该字段在反序列化时未设置,那就太好了。个人认为,这可能会成为 `#[serde(default)]` 的常规行为(不要求字段类型实现 Default,从结构中指定的默认值中获取)。这样,默认值的优先级顺序会是:内容来源: serde-rs/serde