本文将深入探讨 Rust 语言中的 vec::Drain
及其 Drop
实现,作为所有权如何防止内存及其他微妙错误的一个例子。
目标读者:能够阅读 Rust 代码,并对其所有权语义及 Drop
特性有基本(且仅是基本)理解的开发者。
引言
在读《The Rust Programming Language》书籍时,偶然发现了 Vec::drain
方法。
常见的编程语言中,没有见过以 drain
命名的方法,这引起了我的好奇心。
什么是 Vec::drain
?
如果你不熟悉 Vec::drain
,可以像下面这样使用它从 Vec
中抽取元素(类似的方法还存在于 String
、HashMap
及其他多种集合类型中):
let mut values = vec![1, 2, 3, 4, 5];
for val in values.drain(1..3) {
println!("Removed: {}", val);
}
println!("Remaining: {:?}", values);
这段代码的输出为:
Removed: 2
Removed: 3
Remaining: [1, 4, 5]
文档描述
截至 Rust 1.83,文档对 Vec::drain
的描述如下(加粗部分为重点):
批量移除向量中指定范围的元素,返回所有被移除元素的迭代器。如果在完全消费之前迭代器被丢弃,它会丢弃剩余被移除的元素。
返回的迭代器保持对向量的可变借用,以优化其实现。
最后一句,特别是我加粗的部分,引起了我的注意,并促使我深入研究其实现。