如果尚未设置,如何设置嵌套在多个选项中的值?

Áko*_*dra 4 config mutability rust

我有这样的配置设置:

#[derive(Debug, Deserialize, Serialize)]
struct Config {
    defaults: Option<Default>,
}

#[derive(Debug, Deserialize, Serialize)]
struct Default {
    duration: Option<Millis>,
}

#[derive(Serialize, Deserialize, Debug)]
struct Millis(u64);
Run Code Online (Sandbox Code Playgroud)

有一个值let cfg: &mut Config,我怎么能轻松地设置这个值的持续时间?

我试过这个,如果值不存在,它会恐慌:

*cfg.default.as_mut().unwrap().duration.as_mut().unwrap() = Millis(1234)
Run Code Online (Sandbox Code Playgroud)

unwrap除了这个,我还没有找到解决这些s 的方法来按需创建值,这更加冗长......

if cfg.defaults.is_none() {
    cfg.defaults = Some(Default { duration: None });
}

if cfg.defaults.as_mut().unwrap().duration.is_none() {
    cfg.defaults.as_mut().unwrap().duration = Some(Millis(1234));
}
Run Code Online (Sandbox Code Playgroud)

什么是“方法”来做到这一点?

mca*_*ton 5

这是该get_or_insert方法的用途:

#[derive(Debug)]
struct Config {
    defaults: Option<Default>,
}

#[derive(Debug)]
struct Default {
    duration: Option<Millis>,
}

#[derive(Debug)]
struct Millis(u64);

fn main() {
    let mut config = Config { defaults: None };

    config
        .defaults
        .get_or_insert(Default { duration: None })
        .duration
        .get_or_insert(Millis(0))
        .0 = 42;

    // Config { defaults: Some(Default { duration: Some(Millis(42)) }) }
    println!("{:?}", config);
}
Run Code Online (Sandbox Code Playgroud)

(链接到游乐场)