Итераторы сердце языка Rust, язык стремится к zero-cost abstraction (абстракциям с нулевой стоимостью) и итераторы часто работают быстрее классических циклов потому как компилятор оптимизирует их лучше.
Понять итераторы
Поймите три кита итераторов
Все методы итераторов делятся на три группы. Если вы их различаете, то код не будет для вас магией.
- Создатели (iterators): методы которые создают последовательность. Например: lines(), iter(), into_iter(), 0..10;
- Адаптеры (Adapters): они преобразуют итератор в другой итератор. Ленивые методы, это значит, что они ничего не делают пока их не «пнут». Такие методы map(), filter(), filter_map(), take_while().
- Потребители (consumers): методы запускают процесс и превращают итератор в результат (извлекают результат). Это методы collect(), sum(), for_each(), count(), fold().
2) Почему кажется, что информации по итератором мало
Проблема не в количестве, а в том, что документация написана на языке типов.
- Где искать: Самый лучший источник — официальная страница std::iter::Iterator.
- Лайфхак: Слева в документации есть огромный список методов. Просто кликайте на любой (например, inspect или partition) — там всегда есть живой пример кода.
Как эффективно учить
- Не используйте консьюмеров (результирующие методы) в середине итератора. Вам не нужно хранить промежуточный результат, это лишняя трата памяти. Итераторы могут прокидывать дальше без создания промежуточных списков.
- Визуализируйте «трубопровод» — представьте, что итератор это конвейер. filter — это сито, map — покрасочный цех. Данные перемещаются по одному логическому элементу.
- используйте itertools: это стандарт де-факто в Rust сообществе. Библиотека itertools добавляет еще 50+ крутых методов к стандартным. Читая её описание, вы поймете, на что вообще способны итераторы.
Рекомендуемые ресурсы
- Rust Book (Глава 13.2): Итераторы: последовательность элементов — база.
- Rust by Example: Раздел про итераторы (ищите раздел Iterators) — чисто на примерах.
- YouTube: Канал Jon Gjengset (для продвинутых) или The Rust Station.
Практика для заучивания методов
Без практики в программировании никак. Чтобы «набить руку» на итераторах, нужно перестать использовать циклы for и научиться мыслить цепочками превращений.
Вот список задач от простых к сложным. Решайте их, используя только методы итераторов (без mut переменных снаружи, где это возможно).
- Квадраты четных чисел: Дан вектор
vec![1, 2, 3, 4, 5, 6]. Оставьте только четные числа и возведите их в квадрат. Результат соберите вVec<i32>.- Методы:
filter,map,collect.
- Методы:
- Поиск длинных слов: Дан массив строк. Оставьте только те, чья длина больше 5 символов, и сделайте их заглавными.
- Методы:
filter,map.
- Методы:
- Первое число: Найдите в списке чисел первое число, которое делится на 7 и больше 10.
- Методы:
find.
- Методы:
- Сумма зарплат: Дан список сотрудников (структуры с полем
salary: u32). Посчитайте общую сумму зарплат.- Методы:
sumилиfold.
- Методы:
- Безопасный парсинг: Дан список строк
vec!["10", "abc", "20"]. Превратите его вVec<i32>, игнорируя ошибки парсинга.- Методы:
filter_map,parse().ok().
- Методы:
- Все или ничего: Тот же список строк, но если хотя бы одна строка не число — результатом должен быть
None. Если все числа —Some(Vec<i32>).- Подсказка:
collectумеет собиратьIterator<Result>вResult<Vec>.
- Подсказка:
- Плоский список: Дан вектор векторов
vec![vec![1, 2], vec![3, 4]]. Сделайте из него один плоский векторvec![1, 2, 3, 4].- Методы:
flatten(илиflat_map).
- Методы:
- Группировка по парам: Дан список чисел. Создайте итератор, который выдает суммы соседних пар:
[1, 2, 3, 4]->[3, 5, 7].- Подсказка: Посмотрите метод
windows(2).
- Подсказка: Посмотрите метод
- Остановка по условию: Считывайте числа из
std::io(как в вашем коде), но остановитесь, как только сумма введенных чисел превысит 100.- Методы:
scan,take_while.
- Методы:
- Свой итератор: Реализуйте итератор
Fibonacci, который бесконечно выдает числа Фибоначчи.- Задача: Написать
impl Iterator for Fibonacci.
- Задача: Написать
- Zip-архив: Есть два списка: имена и возрасты. Создайте из них
HashMap<String, u32>.- Методы:
zip,collect.
- Методы:
Совет по обучению: когда застрянете, открывайте страницу документации Iterator и просто жмите Ctrl + F, вбивая то, что хотите сделать (например, «sum», «limit», «combine»).






