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

Rust中如何延迟初始化结构体成员?无需手动初始化全部字段

解决方案

你完全可以实现需求,而且#[derive(Default)]对String类型是有效的——标准库已经为String实现了Default trait,默认值是空字符串。具体步骤如下:

1. 为结构体派生Default trait

修改你的结构体定义,添加#[derive(Default)]:

#[derive(Default)]
pub struct NonSteamGame {
    app_id: String,
    app_name: String,
    start_dir: String,
    icon: String,
    shortcut_path: String,
    launch_options: String,
    is_hidden: bool,
    allow_desktop_config: bool,
    allow_overlay: bool,
    open_vr: bool,
    devkit: bool,
    devkit_game_id: String,
    devkit_override_app_id: String,
    last_play_time: String,
    flatpack_app_id: String
}

所有字段都会被赋予对应类型的默认值:String是空字符串,bool是false。

2. 创建默认实例并逐个赋值

因为需要后续修改字段,所以要将实例声明为可变的(mut):

// 创建默认初始化的可变实例
let mut nsg = NonSteamGame::default();

// 模拟从流中读取属性和值的逻辑
let (property_name, value) = ("appid", "12345");

match property_name {
    "appid" => nsg.app_id = value.to_string(),
    "AppName" => nsg.app_name = value.to_string(),
    "StartDir" => nsg.start_dir = value.to_string(),
    "icon" => nsg.icon = value.to_string(),
    // 其他字段的匹配逻辑...
    _ => {}
}

补充说明

如果某些字段需要自定义默认值(比如不想用空字符串或false),可以手动实现Default trait:

impl Default for NonSteamGame {
    fn default() -> Self {
        Self {
            app_id: "default_app_id".to_string(),
            // 其他字段使用默认值或自定义值
            ..Default::default()
        }
    }
}

这种方式可以灵活控制个别字段的默认值,其余字段仍使用标准默认值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:55:24