You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中对可变结构体使用RwLock.read()报DerefMut未实现错误如何解决

问题原因

你之前认为LruCache和本次错误无关的判断是误区,这一报错是两个规则叠加导致的:

  1. 常用的lru crate的get方法签名为fn get(&mut self, k: &K) -> Option<&V>,因为LRU缓存需要在每次读取时更新元素的访问热度、调整内部链表顺序,本身属于写操作,必须拿到可变借用才能调用。
  2. RwLock的读锁返回的RwLockReadGuard只能提供不可变引用,不支持可变借用,自然无法调用需要&mut self的get方法。

解决方案

有两个可选方案,可根据你的业务需求选择:

方案1:使用写锁访问缓存

如果你的业务逻辑需要每次读取都更新LRU的访问热度、保证缓存淘汰策略正常工作,直接将读锁换成写锁即可:

use std::sync::RwLock;
use lru::LruCache;

fn main() {
        let mut cache: LruCache<String,String> = LruCache::new(100);
        cache.put("test".to_string(), "test_value".to_string());
        let lock_cache = RwLock::new(cache);
        // 改为获取写锁
        let wc = lock_cache.write();
        let res = wc.unwrap().get("test");
        assert_eq!(res.unwrap().as_str(), "test_value");
}

方案2:使用不需要可变借用的peek方法读取

如果你不需要在读取时更新元素的访问热度,可以用lru crate提供的peek方法,该方法签名为fn peek(&self, k: &K) -> Option<&V>,不需要可变借用,直接用读锁就能调用:

use std::sync::RwLock;
use lru::LruCache;

fn main() {
        let mut cache: LruCache<String,String> = LruCache::new(100);
        cache.put("test".to_string(), "test_value".to_string());
        let lock_cache = RwLock::new(cache);
        let rc = lock_cache.read();
        // 改用peek方法,不更新访问顺序
        let res = rc.unwrap().peek("test");
        assert_eq!(res.unwrap().as_str(), "test_value");
}

内容的提问来源于stack exchange,提问作者Andrea Castello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:36:00