rust 惰性初始化结构体成员的最佳方法?

ftf50wuq  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(186)

我有这样的结构:

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
}

所有这些字段值都是从流中读取的,并在读取时设置。
有没有什么方法可以创建一个示例,而不需要手动初始化所有的结构体成员,当我从流中得到它们的值时给它们赋值?一个例子(伪代码):

let nsg = NonSteamGame {} //Do not initialize all values manually here

... get property_name and value from stream...

match property_name {
    "appid" => nsg.app_id = String::new(value)
    "AppName" => nsg.app_name = String::new(value)
    "StartDir" => ...
    "icon" => ...
}

我知道我可以使用#[derive(Default)]来处理标量类型,但似乎它不适用于String类型。

bq3bfh9z

bq3bfh9z1#

对于这种情况,最好的选择可能是派生Default特性。

#[derive(Default)]
pub struct NonSteamGame {
    app_id:String ,
    app_name:String,
...

然后,用NonSteamGame::default()而不是::new()示例化,如果需要保持向后兼容性,甚至可以创建new facade:

pub fn new() -> Self {
        Self::default()
    }

相关问题