如果我刚刚将它弹回()后,我可以将引用推送到具有更长寿命的向量吗?

Mai*_*tor 2 rust

在这里,我无法添加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();
}
Run Code Online (Sandbox Code Playgroud)

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

She*_*ter 5

绝对不是安全的锈.编译器不知道什么Vec::pushVec::pop做.所有它知道的是它可以从函数签名中得知 - 你必须推送与Vec参数化的相同类型.

在不安全的Rust中执行此操作可能是可行的,但是不安全的代码很难做到正确.正如loganfsmyth所提到的,如果你以某种方式将"无效"值推入其中Vec然后发生恐慌,那么该值在函数退出后仍然在向量中.现在析构函数Vec可以访问无效内存,破坏Rust的保证.这是一件坏事.

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

  • 使用Iterator::chainiter::once将值组合到一个迭代器中.
  • 在切片周围创建包装器类型,并显示一个公开所需操作的值.