You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Serde注解获取结构体默认实例,无需手动定义?

问题:能否基于Serde注解自动生成结构体的默认实例?

假设我们有如下示例代码(实际代码包含数十个字段):

fn empty_field() -> Result<f64, String> {
    Err(String::new())
}

#[derive(Deserialize, Serialize)]
struct Record {
    #[serde(rename = "Apple", default)]
    a: f64,
    #[serde(rename = "Banana", default)]
    b: String,
    #[serde(rename = "Coconut", default = "empty_field")]
    c: Result<f64, String>,
}

是否可以基于Serde注解获取该结构体的默认实例,而非像下面这样手动定义?

let empty_record = Record {
    a: 0.0,
    b: String::new(),
    c: Err(String::new()),
};

回答

当然可以,不需要手动逐个字段赋值来创建默认实例,你可以结合Default trait和Serde的注解来自动生成:

  1. 首先给结构体派生Default trait,对于a、b这类本身实现了Default且用#[serde(default)]的字段,Default::default()会自动生成符合Serde默认逻辑的值(比如f64默认是0.0,String默认是空字符串)。
  2. 对于像c这种指定了自定义默认函数的字段,你需要手动补充Default trait的实现,调用对应的自定义函数即可。

修改后的代码示例:

fn empty_field() -> Result<f64, String> {
    Err(String::new())
}

#[derive(Deserialize, Serialize, Default)]
struct Record {
    #[serde(rename = "Apple", default)]
    a: f64,
    #[serde(rename = "Banana", default)]
    b: String,
    #[serde(rename = "Coconut", default = "empty_field")]
    c: Result<f64, String>,
}

// 手动实现Default,对齐Serde的自定义默认逻辑
impl Default for Record {
    fn default() -> Self {
        Self {
            a: Default::default(),
            b: Default::default(),
            c: empty_field(),
        }
    }
}

之后你就可以直接通过Record::default()获取和手动定义完全一致的默认实例:

let empty_record = Record::default();

如果你的结构体大部分字段都用标准默认值,只有少数需要自定义,这种方式能省去大量手动赋值的重复工作。


内容的提问来源于stack exchange,提问作者lucatrv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:53:30