Rust中对可变结构体使用RwLock.read()报DerefMut未实现错误如何解决
问题原因
你之前认为LruCache和本次错误无关的判断是误区,这一报错是两个规则叠加导致的:
- 常用的
lrucrate的get方法签名为fn get(&mut self, k: &K) -> Option<&V>,因为LRU缓存需要在每次读取时更新元素的访问热度、调整内部链表顺序,本身属于写操作,必须拿到可变借用才能调用。 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
相关产品推荐
相关产品推荐

