我一直在查看文档,到目前为止,我还没有看到一个内置函数可以安全地将项目移出Vec
。
Vec::get
存在,但这只是借用。 Vec::remove
存在,虽然它确实移出了向量,但如果索引超出范围,它也会感到恐慌。所以,我有两个问题:
- 从矢量中移动项目的预期/好方法是什么?
- 如果超出范围,
remove(&mut self, index: usize) -> T
会惊慌失措。恐慌的原因可能是什么?为什么不像remove(&mut self, index: usize) -> Option<T>
那样实现?
如果你说在 Rust 上下文中安全,我们会想到内存安全。 .remove(i)
在常规 Rust 术语中肯定是安全的,只是为了澄清一下。拨打panic!()
是安全的。
.remove(i)
和 .swap_remove(i)
的错误行为与使用v[i]
语法索引向量的错误行为相同:如果i
超出范围,则它是程序员错误,库函数会死机。这在错误处理指南中也称为合同违约条款。
因此,库背后的想法是,只有当您知道i
在边界内时,您才能使用v[i]
或v.remove(i)
,并且如果您愿意,您确实可以检查它是否正在使用i < v.len()
或v.get(i)
。
还有另一个函数允许您将元素移出向量而不可能惊慌失措,那就是v.pop()
它删除向量中的最后一项,返回Option<T>
Vec<T>
。
Vec::into_iter()
获取生成移动对象的迭代器,然后使用迭代器 API 选择所需的项。
要将第一项移出Vec
(并丢弃所有其他物品),请执行以下操作:
my_vec.into_iter().next()
.expect("Expecting at least 1 item in vec")
还有vec::drain
,它将为您提供一系列已删除值的迭代器。 不过现在我看了,这种方法也会对越界访问感到恐慌......