【发布时间】:2018-03-19 13:33:37
【问题描述】:
我有一个类似缓存的结构,内部使用HashMap:
impl Cache {
fn insert(&mut self, k: u32, v: String) {
self.map.insert(k, v);
}
fn borrow(&self, k: u32) -> Option<&String> {
self.map.get(&k)
}
}
Playground with external mutability
现在我需要内部可变性。由于HashMap 没有实现Copy,我猜RefCell 是要遵循的路径。编写insert 方法很简单,但我遇到了借用功能的问题。我可以返回一个Ref<String>,但是因为我想缓存结果,所以我写了一个小的Ref-wrapper:
struct CacheRef<'a> {
borrow: Ref<'a, HashMap<u32, String>>,
value: &'a String,
}
这不起作用,因为value 引用borrow,因此无法构造结构。我知道引用总是有效的:地图不能变异,因为Ref 锁定 地图。使用原始指针代替引用是否安全?
struct CacheRef<'a> {
borrow: Ref<'a, HashMap<u32, String>>,
value: *const String,
}
我在这里忽略了什么吗?有更好(或更快)的选择吗?由于运行时开销,我试图避免RefCell。
【问题讨论】:
-
我写了一个小的
Ref-wrapper——写这样一个包装器究竟有什么好处? -
使用包装器,我可以在地图中搜索键并存储结果。取消引用
Ref将产生&HashMap,取消引用包装器将产生&T -
Ref有一个map关联函数,应该用于将对整个地图的引用转换为对一个元素的引用。但是它的签名不够灵活;我无法使用Option包装器。 -
@SebastianRedl 是的,I'm stuck as well.
标签: pointers rust lifetime unsafe