Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

collect

Метод collect позволяет построить коллекцию из Iterator.

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let primes = vec![2, 3, 5, 7];
    let prime_squares = primes.into_iter().map(|p| p * p).collect::<Vec<_>>();
    println!("prime_squares: {prime_squares:?}");
}
This slide should take about 5 minutes.
  • Любой итератор можно собрать в Vec, VecDeque или HashSet. Итераторы, которые выдают пары «ключ-значение» (то есть двухэлементные кортежи), можно собирать и в HashMap, и в BTreeMap.

Покажите студентам определение collect в документации стандартной библиотеки. Есть два способа задать обобщённый тип B для этого метода:

  • С «turbofish»: some_iterator.collect::<COLLECTION_TYPE>(), как показано. Сокращение _, использованное здесь, позволяет Rust вывести тип элементов Vec.
  • С выводом типов: let prime_squares: Vec<_> = some_iterator.collect(). Перепишите пример в этой форме.

Для дальнейшего изучения

  • Если студентам интересно, как это работает, можно вспомнить трейт FromIterator, который определяет, как каждый тип коллекции строится из итератора.
  • Помимо базовых реализаций FromIterator для Vec, HashMap и т. д., есть и более специализированные реализации, которые позволяют делать интересные вещи, например превратить Iterator<Item = Result<V, E>> в Result<Vec<V>, E>.
  • Аннотации типов с collect часто нужны потому, что он обобщён по своему возвращаемому типу. Во многих случаях это затрудняет компилятору вывод правильного типа.