首页 > 解决方案 > 如果我 pop() 之后将其返回,我可以推送对具有更长生命周期的向量的引用吗?

问题描述

在这里,我无法添加thing到向量,因为它的生命周期不同于'a

pub fn foo<'a>(vec: &'a mut Vec<&'a Thing>) {
    let thing: Thing = new_thing();
    vec.push(&thing);
    // do stuff with vec
    vec.pop();
}

请注意,我总是将其从向量中删除,并且向量不会进一步重新排序,因此此操作应该是安全的。我认为很难说服编译器,但是有什么技巧可以达到同样的效果吗?

标签: rust

解决方案


绝对不是安全的 Rust。编译器不知道做什么Vec::pushVec::pop做什么。它所知道的只是它可以从函数签名中看出什么——你必须推送与Vec参数化的类型相同的类型。

在不安全的 Rust 中这样做可能是可能的,但不安全的代码很难正确处理。正如loganfsmyth 提到的那样,如果您以某种方式将“无效”值推入Vec,然后发生恐慌,则该值在函数退出后仍在向量中。现在 的析构函数Vec可以访问无效内存,颠覆了 Rust 的保证。这是一件坏事。

对于您的实际问题,可能有更好的解决方案。可能的途径:

  • 使用Iterator::chainanditer::once将值组合到一个迭代器中。
  • 围绕切片和公开所需操作的单个值创建包装器类型。

推荐阅读