如何避免打开访问以Option为值的HashMap返回的Option



我正在阅读这本入门书。在第13.1节中;高速缓存";并要求读者用CCD_ 1来实现。我已经开始工作了,但我不太满意,因为打给unwrap()的电话似乎有点不合时宜。

具体来说,在Cacher::value()中,Some(v) => v.unwrap()调用让我不高兴——考虑到unwrap()的文档中指出应该避免对函数的调用。对于我正在努力完成的事情,有什么更好/更习惯的建议?

代码:

use std::collections::HashMap;
struct Cacher<T> {
calculation: T,
hmap: HashMap<u32, Option<u32>>,
}
impl<T> Cacher<T>
where
T: Fn(u32) -> u32,
{
fn new(calculation: T) -> Cacher<T> {
Cacher {
calculation,
hmap: HashMap::new(),
}
}
fn value(&mut self, arg: u32) -> u32 {
match self.hmap.get(&arg) {
Some(v) => v.unwrap(),
None => {
let v = (self.calculation)(arg);
self.hmap.insert(arg, Some(v));
v
}
}
}
}
fn main() {
let mut cache = Cacher::new(|x| x * x);
let v = vec![cache.value(1), cache.value(2), cache.value(3)];
println!("v: {:?}", v);
}

HashMap<u32, Option<u32>>中不需要有Option,因为HashMap本身可以表示是否缓存了值。新的和改进的代码:

use std::collections::HashMap;
struct Cacher<T> {
calculation: T,
hmap: HashMap<u32, u32>,
}
impl<T> Cacher<T>
where
T: Fn(u32) -> u32,
{
fn new(calculation: T) -> Cacher<T> {
Cacher {
calculation,
hmap: HashMap::new(),
}
}
fn value(&mut self, arg: u32) -> u32 {
match self.hmap.get(&arg) {
Some(v) => *v,
None => {
let v = (self.calculation)(arg);
self.hmap.insert(arg, v);
v
}
}
}
}
fn main() {
let mut cache = Cacher::new(|x| x * x);
let v = vec![cache.value(1), cache.value(2), cache.value(3)];
println!("v: {:?}", v);
}

最新更新