我正在讀Rust書第二版中的the section on closures。在本節的最後,有一個練習來擴展前面給出的Cacher
實現。我試了一下:如何從緩存任意結果的結構中刪除過多的「克隆」調用?
use std::cmp::Eq;
use std::hash::Hash;
use std::clone::Clone;
struct Cacher<T, K, V>
where
T: Fn(K) -> V,
K: Eq + Hash + Clone,
V: Clone,
{
calculation: T,
values: HashMap<K, V>,
}
impl<T, K, V> Cacher<T, K, V>
where
T: Fn(K) -> V,
K: Eq + Hash + Clone,
V: Clone,
{
fn new(calculation: T) -> Cacher<T, K, V> {
Cacher {
calculation,
values: HashMap::new(),
}
}
fn value(&mut self, arg: K) -> V {
match self.values.clone().get(&arg) {
Some(v) => v.clone(),
None => {
self.values
.insert(arg.clone(), (self.calculation)(arg.clone()));
self.values.get(&arg).unwrap().clone()
}
}
}
}
在創建了一個終於有效的版本之後,我真的很不滿意它。真正讓我感到困擾的是cacher.value(...)
有5(!)個電話給clone()
。有沒有辦法避免這種情況?
在未來,請你圍繞着審查並改進[代碼審查(HTTPS你已經工作代碼的問題://代碼審查。 stackexchange.com/questions/tagged/rust?),但[請先閱讀指南](https://codereview.meta.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-溢出的用戶)。 – Shepmaster