我正在使用Rust编程语言学习Rust .我在处理闭包的章节中正在处理以下任务:
尝试修改
Cacher以保存哈希映射而不是单个值.哈希映射的键将arg是传入的值,并且哈希映射的值将是在该键上调用闭包的结果.值函数不会查看是否self.value直接具有值Some或None值,而是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 次 |
| 最近记录: |