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

Eva*_*oll 1 iterator rust

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Cer*_*rus 6

这看起来有点措辞不准确。

这些单词的真正含义是:如果删除drain迭代器而不用尽它,它将删除用于其创建的所有元素。正如您已要求它仅使用前三个元素一样,它不会清空整个矢量,而只会清空第一部分。但是即使没有使用它也会这样做:

fn main() {
    let mut a = vec![1, 2, 3, 4, 5];
    {
        let _ = a.drain(0..3);
    }

    println!("Hello, world! {:?}", a);
}
Run Code Online (Sandbox Code Playgroud)
Hello, world! [4, 5]
Run Code Online (Sandbox Code Playgroud)

操场

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