如何说服借阅检查器允许我缓存值?

化解

借阅检查员击败了我:

use std::collections::HashMap;

struct Cache {
    cache: Vec<HashMap<String, String>>,
}

impl Cache {
    fn get(&mut self, index: usize, key: String) -> String {
        let mut cache = &mut self.cache[index];
        match cache.get(&key) {
            Some(r) => {
                return r.clone();
            }
            None => {
                let r = "foo".to_string(); // something smart here
                cache.insert(key, r.clone());
                return r;
            }
        }
    }
}

我得到的是:

error[E0502]: cannot borrow `*cache` as mutable because it is also borrowed as immutable
  --> src/main.rs:16:17
   |
10 |         match cache.get(&key) {
   |               ----- immutable borrow occurs here
...
16 |                 cache.insert(key, r.clone());
   |                 ^^^^^ mutable borrow occurs here
...
19 |         }
   |         - immutable borrow ends here

如何重写我的代码以便编译?

烧寿司5

另一种方法是使用entry接口。这种方法的唯一缺点是(当前)不使用BorrowFromget方法使用的基础结构,这使其灵活性降低了。在您的情况下,这不是问题,因为get它拥有一个拥有的密钥。这样做的好处entry是它只执行一次哈希查找,而使用则get强制您执行两次查找。

use std::collections::HashMap;

struct Cache {
    cache: Vec<HashMap<String, String>>,
}

impl Cache {
    fn get(&mut self, index: usize, key: String) -> String {
        self.cache[index]
            .entry(key)
            .or_insert_with(|| "foo".to_string())
            .clone()
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何升级我的Slicable特性以满足反复调用中的借阅检查器

困惑的借阅检查器消息

父母子女关系借阅检查器

了解两次在迭代器上调用方法时如何满足借阅检查器?

如何在不烦恼借阅检查器的情况下为双向地图建模?

如何告知借阅检查器已清除的Vec不包含借入?

如何在不违背借阅检查器的情况下进行状态转换?

如何用这个简单的代码满足Rust借阅检查器的要求?

可以委托解析器的借阅检查器问题

借阅检查器“无法移出借用内容”

什么时候有必要规避Rust的借阅检查器?

Rust借阅检查器是否在本地或全局分析程序?

使用特征作为类型参数时借阅检查器失败

我如何说服Spring 4.2将OPTIONS请求传递给控制器

如何说服我已登录的Django?

如何清理(重置)我的装饰器的缓存?

我如何让用户仅借阅书籍而不进行审阅?

如何检查我的RDD或数据帧是否已缓存?

如何检查资源是否被浏览器从 Javascript 缓存?

如何说服我正在使用数值向量的fct_infreq?

我如何说服UnmarshalJSON使用slice子类型?

如何说服WebStorm我的用户脚本加载了jQuery?

如何确定地说服苹果我不想安装iCloud?

如何检查我的应用是否允许显示通知

借阅检查器:不能借为不可变的,因为它也借为可变的

为什么借阅检查器会拒绝内联表达式,但接受其细分形式?

类似于zip的函数中的借阅检查器问题,带有回调

PC不允许我跳过不需要引导的驱动器上的磁盘检查;如何在运行时检查磁盘?

我们如何在 c 中检查内联汇编中的寄存器值?