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часто нужны потому, что он обобщён по своему возвращаемому типу. Во многих случаях это затрудняет компилятору вывод правильного типа.