我一直在查看文档,到目前为止,我还没有看到内置函数来安全地将项目移出Vec
。
Vec::get
存在,但这只是借用。 Vec::remove
存在,虽然它确实移出了向量,但如果索引超出范围,它也会发生混乱。所以,我有两个问题:
remove(&mut self, index: usize) -> T
会发生恐慌。恐慌的原因可能是什么?为什么不实现remove(&mut self, index: usize) -> Option<T>
?答案 0 :(得分:7)
如果您在Rust上下文中说 safe ,我们会考虑内存安全性。 .remove(i)
在常规Rust术语中肯定是安全的,只是为了澄清。致电panic!()
安全。
.remove(i)
和.swap_remove(i)
的错误行为与使用v[i]
语法索引向量的行为相同:如果i
超出范围,则是程序员错误,图书馆功能恐慌。这在错误处理指南中也称为合同违规子句。
因此,图书馆背后的想法是,如果您知道v[i]
在边界内,您只能使用v.remove(i)
或i
,并且您确实可以检查它是否正在使用{{1如果你愿意,可以使用i < v.len()
。
还有另一个函数可以让你从一个向量中移出一个元素而不会出现恐慌,那就是v.get(i)
删除了向量中的最后一项,为{{1}返回v.pop()
}}
答案 1 :(得分:1)
还有vec::drain
,它将为您提供一系列已删除的值的迭代器。现在我看一下,这种方法也会对越界访问感到恐慌......