Á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)
什么是“方法”来做到这一点?
这是该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)