我一直在查看文档,到目前为止我还没有看到一个内置函数可以安全地将项目移出 Vec
.
Vec::get
存在,但那只是借用。 Vec::remove
存在,虽然它确实移出向量,但如果索引超出范围,它也会出现 panic 。所以,我有两个问题:
- 从向量中移动项目的预期/好的方法是什么?
-
remove(&mut self, index: usize) -> T
如果超出范围就会 panic 。 panic 的原因可能是什么?为什么不像remove(&mut self, index: usize) -> Option<T>
那样实现?
最佳答案
如果你在 Rust 上下文中说安全,我们会想到内存安全。 .remove(i)
在常规的 Rust 术语中肯定是安全的,只是为了澄清一下。打电话panic!()
是安全的。
.remove(i)
的错误行为和 .swap_remove(i)
与使用 v[i]
索引向量相同句法:如果i
越界,这是一个程序员错误,库函数 panic 。这在错误处理指南中也称为违反契约(Contract)条款。
所以库背后的想法是你只使用 v[i]
或 v.remove(i)
如果你知道 i
在范围内,您确实可以检查它是否正在使用 i < v.len()
或 v.get(i)
如果你愿意的话。
还有另一个函数可以让你将一个元素从向量中移出而不用担心,那就是v.pop()
。它删除向量中的最后一项,返回 Option<T>
对于 Vec<T>
.
关于rust - 内置*安全*方式移出 Vec<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37489004/