【问题标题】:Best way to lazy initialize struct members?延迟初始化结构成员的最佳方法?
【发布时间】:2022-12-28 21:13:41
【问题描述】:

我有这个结构:

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 类型。

【问题讨论】:

  • Default 是为String 实现的。您能否更详细地解释什么不起作用?
  • 当我使用类似 let a = NonSteamGame{}; 的东西时我收到一堆错误,指出结构字段中缺少 app_id,et...。也许这不是正确的语法?
  • 您可以尝试构建器模式。 This crate 甚至为您的结构编写构建器
  • @Notbad 一旦派生Default,使用NonSteamGame::default() 获取具有默认值的结构实例

标签: rust struct initialization lazy-initialization


【解决方案1】:

对于这种情况,最好的选择可能是派生默认特征。

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

然后,用 NonSteamGame::default() 实例化而不是 ::new()。 你甚至可以制作new外观:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多