在Programming Rust的第327页上,您可以找到以下语句
但是,与
into_iter()
方法按值获取集合并使用它的方法不同,drain
仅借用对集合的可变引用,并且当迭代器为删除后,它将从集合中删除任何剩余元素,并将其留空。
我对它表示从集合中删除任何剩余元素的含义感到困惑?我可以从这段代码中看到,当删除迭代器时,a
中的其余元素仍然存在,
fn main() {
let mut a = vec![1, 2, 3, 4, 5];
{
let b: Vec<i32> = a.drain(0..3).collect();
}
println!("Hello, world! {:?}", a);
}
也许我只是对措辞感到困惑。还有什么呢?
答案 0 :(得分:6)
这看起来有点不准确。
这些词的真正含义是:如果丢弃drain
迭代器而不用尽它,它将删除所有用于创建它的元素。正如您要求它仅使用前三个元素一样,它不会清空整个向量,而只会清空第一部分;但是即使没有使用它也会这样做:
fn main() {
let mut a = vec![1, 2, 3, 4, 5];
{
let _ = a.drain(0..3);
}
println!("Hello, world! {:?}", a);
}
Hello, world! [4, 5]
您可以通过以下方式理解这一点:这里提到的“集合”不是调用drain
的初始集合,而是由传递范围指定的“子集合”。