【发布时间】:2022-01-27 12:55:40
【问题描述】:
正如第 13 章所建议的,我正在尝试使用 HashMap 实现缓存器。与其他一些问题不同,我试图遵循作者采取的方法,并在缓存中使用 Option 作为值。
struct Cacher<T>
where T: Fn(u32) -> u32, //struct needs to know Type of closure(aka calc)
{
calc: T,
value: Option<HashMap<u32, u32>>
}
impl<T> Cacher<T>
where T: Fn(u32) -> u32,{
fn new(calculation: T) -> Cacher<T>{
Cacher {
calc: calculation,
value: None
}
}
fn value(&mut self, arg: u32) -> u32 {
match &mut self.value {
Some(map) => {
let v = map.entry(arg).or_insert((self.calc)(arg));
*v
},
None => {
let mut map = HashMap::new();
let v = map.insert(arg, (self.calc)(arg)).unwrap();
self.value = Some(map);
v
}
}
}
}
代码编译,但甚至运行一个简单的:
let mut expensive_res = Cacher::new( |num| {
println!("calculating slowly....{}", num);
thread::sleep(Duration::from_secs(1));
num + 100
});
println!("{}", expensive_res.value(1));
我在运行它时出现恐慌。
线程“主”在“在 None 值上调用 Option::unwrap()”时出现恐慌。
有什么建议么?为什么 unwrap 这里是 None ?
非常感谢
【问题讨论】: