Руст утечка, итератор упал ... "удаляет все оставшиеся элементы" - PullRequest
1 голос
/ 07 октября 2019

На странице 327 из Programming Rust вы можете найти следующую инструкцию

Однако, в отличие от метода 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 Ответ

6 голосов
/ 07 октября 2019

Это выглядит немного неточной формулировкой.

Реальное значение этих слов таково: если вы отбросите итератор 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, а скорее «подколлекция», заданная переданным диапазоном.

...