【发布时间】:2021-08-29 20:47:56
【问题描述】:
按照第 13.1 章的建议,我尝试使用 HashMap 实现缓存器:
use std::collections::HashMap;
pub struct Cacher<T, U>
where
T: Fn(U) -> U,
U: std::cmp::Eq + std::hash::Hash + Copy,
{
calculation: T,
values: HashMap<U, U>,
}
impl<T, U> Cacher<T, U>
where
T: Fn(U) -> U,
U: std::cmp::Eq + std::hash::Hash + Copy,
{
pub fn new(calculation: T) -> Cacher<T, U> {
Cacher {
calculation,
values: HashMap::new(),
}
}
pub fn value(&mut self, arg: U) -> &U{
self.values.entry(arg).or_insert((self.calculation)(arg))
}
}
但运行以下代码:
use cacher::Cacher;
fn main() {
let mut cacher = Cacher::new(|arg|{
println!("Executing for {:?}", arg);
arg
});
assert_eq!(cacher.value(1), &1);
assert_eq!(cacher.value(2), &2);
assert_eq!(cacher.value(3), &3);
assert_eq!(cacher.value(1), &1);
assert_eq!(cacher.value(2), &2);
}
产生以下输出:
Compiling cacher v0.1.0 (C:\Users\felix\Programming\rust\projects\Cacher)
Finished dev [unoptimized + debuginfo] target(s) in 0.67s
Running `target\debug\cacher.exe`
Executing for 1
Executing for 2
Executing for 3
Executing for 1
Executing for 2
显示缓存器不起作用,为每次调用 value 执行计算,即使是已知的 args。 价值函数出了什么问题
【问题讨论】:
-
@interjay play.rust-lang.org/… 或 play.rust-lang.org/…
标签: rust