锈的流失,迭代器下降了……“删除了所有剩余元素”

时间:2019-10-07 02:41:25

标签: rust iterator

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);
}

也许我只是对措辞感到困惑。还有什么呢?

1 个答案:

答案 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]

playground

您可以通过以下方式理解这一点:这里提到的“集合”不是调用drain的初始集合,而是由传递范围指定的“子集合”。