rust - 如果我 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。编译器不知道做什么Vec::push
和Vec::pop
做什么。它所知道的只是它可以从函数签名中看出什么——你必须推送与Vec
参数化的类型相同的类型。
在不安全的 Rust 中这样做可能是可能的,但不安全的代码很难正确处理。正如loganfsmyth 提到的那样,如果您以某种方式将“无效”值推入Vec
,然后发生恐慌,则该值在函数退出后仍在向量中。现在 的析构函数Vec
可以访问无效内存,颠覆了 Rust 的保证。这是一件坏事。
对于您的实际问题,可能有更好的解决方案。可能的途径:
- 使用
Iterator::chain
anditer::once
将值组合到一个迭代器中。 - 围绕切片和公开所需操作的单个值创建包装器类型。
推荐阅读
- php - setter方法中的void和self有什么区别
- c# - 如何从控制台应用程序启动 MVC 应用程序?
- flask - Peewee 和 Flask-admin:我无法在管理视图中显示引用表中的字段
- python - Kivy 中的 TextInput 表。如何访问每个 TextInputs
- javascript - 如何确保道具的更改仅在某个事件完成后才触发渲染?
- traefik - Traefik - HTTPS 证书更新延迟
- javascript - 如何在没有表单的情况下将文件上传到 s3 存储桶?
- git - 本地和删除分支在 master 上 rebase 和 push -f 后发生了分歧
- typo3 - realurl 中的其他语言失败
- c# - 一个目标的多个图像