这个问题在这里已有答案:
-
How can I model a bidirectional map without annoying the borrow checker? 1回答
-
Why can't I store a value and a reference to that value in the same struct? 2个答案
我有一个struct Oid
,它拥有一个不同对象的向量 . 它还有一个反向映射,它将对象映射到向量中的索引 . 永远不会从结构中删除对象 . 但是,可以添加新对象 . 用例很简单:我需要通过索引和给定对象的索引快速检索对象 . 这是我到目前为止的尝试:
struct Oid<'a, T>
where
T: Eq + Hash,
{
objects: Vec<Box<T>>,
rev_map: HashMap<&'a T, usize>,
}
impl<'a, T> Oid<'a, T>
where
T: Eq + Hash,
{
pub fn insert(&mut self, t: T) -> usize {
match self.objects.get(&t) {
Some(&i) => i,
_ => {
let i = self.objects.size();
self.objects.push(Box::new(t));
self.rev_map
.insert(unsafe { &*(&*self.objects[i] as *const T) }, i);
i
}
}
}
}
由于对象的内存位置可以随着向量的增长而改变,因此我将每个对象放在 Box
中,以确保地址稳定性 . 问题出在 rev_map
中,我无法弄清楚如何告诉Rust对象引用永远不会比结构更长 . 有没有办法在惯用的Rust中做到这一点?