我有一个结构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中做到这一点?