【发布时间】:2018-07-02 10:04:08
【问题描述】:
我从 Rust 开始,很难理解下面的 sn-p 代码如何输出它的作用。当条目存在时,or_insert 方法中的闭包肯定不应该被调用,还是我完全遗漏了什么?
struct Cacher {
result: HashMap<u32, u32>,
}
impl Cacher {
fn new() -> Cacher {
Cacher{
result: HashMap::new()
}
}
fn result(&mut self, arg: u32) -> u32 {
match self.result.get(&arg) {
Some(v) => println!("I have value {} for {}", v, arg),
None => println!("No value for {}", arg)
}
let closure = |x| {
println!("Doing complicated stuff.....");
thread::sleep(Duration::from_secs(2));
x + 42
};
let v = self.result.entry(arg).or_insert((closure)(arg));
*v
}
}
fn main() {
let mut business_logic = Cacher::new();
business_logic.result(10);
business_logic.result(10);
}
输出:
No value for 10
Doing complicated stuff.....
I have value 52 for 10
Doing complicated stuff.....
【问题讨论】: