以*安全*的方式内置以搬出Vec<T>?

  • 本文关键字:安全 方式 内置 Vec rust
  • 更新时间 :
  • 英文 :


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

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

  1. 从矢量中移动项目的预期/好方法是什么?
  2. 如果超出范围,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,它将为您提供一系列已删除值的迭代器。 不过现在我看了,这种方法也会对越界访问感到恐慌......

最新更新