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
相关产品推荐
相关产品推荐

