在这里,我无法添加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)
请注意,我总是从向量中删除它,并且向量不会进一步重新排序,因此此操作应该是安全的.我认为很难说服编译器,但是有什么技巧可以达到同样的目的吗?
绝对不是安全的锈.编译器不知道什么Vec::push和Vec::pop做.所有它知道的是它可以从函数签名中得知 - 你必须推送与Vec参数化的相同类型.
在不安全的Rust中执行此操作可能是可行的,但是不安全的代码很难做到正确.正如loganfsmyth所提到的,如果你以某种方式将"无效"值推入其中Vec然后发生恐慌,那么该值在函数退出后仍然在向量中.现在析构函数Vec可以访问无效内存,破坏Rust的保证.这是一件坏事.
对于您的真实问题,可能有更好的解决方案.可能的途径:
Iterator::chain和iter::once将值组合到一个迭代器中.| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |