我将代码简化为以下几行:
#[derive(Debug)]
struct Config {
values: Vec<String>,
compiled: Option<Vec<String>>,
}
impl Config {
fn comp_values(&mut self) -> &Vec<String> {
if self.compiled.is_none() {
self.compiled = Some(self.values.clone());
}
self.compiled.as_ref().unwrap()
}
fn comp_values_match(&mut self) -> &Vec<String> {
match self.compiled {
Some(_) => self.compiled.as_ref().unwrap(),
None => {
self.compiled = Some(self.values.clone());
self.compiled.as_ref().unwrap()
}
}
}
}
fn main() {
let mut c = Config {
values: vec![String::from("a"), String::from("b")],
compiled: None,
};
println!("config before: {:?}", c);
println!("compiled: {:?}", c.comp_values());
println!("config after: {:?}", c);
}
我想拥有的东西是:
match self.compiled {
Some(v) => v,
None => {
// assemble v and assign it to self.compiled
v
},
}
就像书中的closure chapter一样。由于u32
实现了Copy
特性,因此在书中是否可能仅起作用?如果将match
行更改为match self.compiled.as_ref()
,则Some(v) => v,
有效。然后,在None
分支中,我将无法像self.compiled = ...
那样进行分配,因为我在该块中具有变量'open'(或用self.compiled.as_ref()
引用)。
我的假设正确吗?在这种情况下,comp_values()
方法是否是最优雅的解决方案?