在HashMap-value之后匹配比克隆它更优雅的方式

PEA*_*EAR 5 hash caching rust

我正在使用Rust编程语言学习Rust .我在处理闭包章节中正在处理以下任务:

尝试修改Cacher以保存哈希映射而不是单个值.哈希映射的键将arg是传入的值,并且哈希映射的值将是在该键上调用闭包的结果.值函数不会查看是否self.value直接具有值SomeNone值,而是arg在哈希映射中查找并返回值(如果存在).如果它不存在,Cacher则将调用闭包并将结果值保存在与其arg值相关联的哈希映射中.

这是我的解决方案:

use std::collections::HashMap;

struct Cacher<T>
where
    T: Fn(i32) -> i32,
{
    calculation: T,
    values: HashMap<i32, i32>,
}

impl<T> Cacher<T>
where
    T: Fn(i32) -> i32,
{
    fn new(calculation: T) -> Cacher<T> {
        Cacher {
            calculation,
            values: HashMap::new(),
        }
    }
    fn value(&mut self, arg: i32) -> i32 {
        match self.values.get(&arg) {
            Some(v) => *v,
            None => {
                let v = (self.calculation)(arg);
                self.values.insert(arg, v);
                v
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

error[E0502]: cannot borrow `self.values` as mutable because it is also borrowed as immutable
  --> src/main.rs:26:17
   |
22 |         match self.values.get(&arg) {
   |               ----------- immutable borrow occurs here
...
26 |                 self.values.insert(arg, v);
   |                 ^^^^^^^^^^^ mutable borrow occurs here
...
29 |         }
   |         - immutable borrow ends here
Run Code Online (Sandbox Code Playgroud)

我可以用以下方法解决这个问题

match self.values.clone().get(&arg) { ...
Run Code Online (Sandbox Code Playgroud)

我是否真的需要克隆整体HashMap以在match-statement中使用它并在之后插入值?

归档时间:

查看次数:

408 次

最近记录:

8 年,6 月 前