rust - 内置*安全*方式移出 Vec<T>?

标签 rust

我一直在查看文档,到目前为止我还没有看到一个内置函数可以安全地将项目移出 Vec .

Vec::get存在,但那只是借用。 Vec::remove存在,虽然它确实移出向量,但如果索引超出范围,它也会出现 panic 。所以,我有两个问题:

  1. 从向量中移动项目的预期/好的方法是什么?
  2. 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/

相关文章:

rust - 为什么排序需要这么长时间?

vector - 在迭代器中找到第一个特定的枚举变体并对其进行转换

syntax - 什么是类型归属?

intellij-idea - Rust 编译模式之间的区别

rust - Rust 如何理解仅使用 FromIterator::from_iter 来调用 from_iter 的适当实现?

rust - 借用一个借来的数组的一段作为借来的数组

rust - 如何在结构的所有生命周期中实现特征?

rust - 如何访问 SystemTime 中的 as_secs?为枚举结果找到 "no method named ` as_secs”

rust - 无法移出 `Fn` 闭包中捕获的变量

Rust 正确的错误处理(自动从一种错误类型转换为另一种带有问号的错误类型)