这个问题在这里已有答案:

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