Адаптеры и потребители
Цепочки операций
«Адаптеры и потребители» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Два вида методов
Методы итераторов делятся на две группы:
- Адаптеры возвращают новый итератор и являются ленивыми (
map,filter,take) - Потребители запускают итератор и выдают конечное значение (
sum,collect,for_each)
Каждый конвейер состоит из нуля или более адаптеров, за которыми следует ровно один потребитель.
take: ограничиваем количество
take(n) выдаёт не более n элементов, а затем останавливается. Это адаптер, поэтому он остаётся ленивым.
Он работает даже с бесконечными итераторами, выдавая только нужное количество элементов.
fn main() {
let first_three: Vec<i32> = (1..).take(3).collect();
println!("{:?}", first_three);
}skip: пропускаем первые элементы
skip(n) отбрасывает первые n элементов и выдаёт остальные. Объедините его с take, чтобы получить фрагмент из середины.
fn main() {
let window: Vec<i32> = (1..=10).skip(3).take(4).collect();
println!("{:?}", window);
}enumerate: добавляем индекс
enumerate выдаёт кортежи (index, value), начиная отсчёт с нуля. Это идиоматичный способ получать позиции без ручного счётчика.
fn main() {
let letters = vec!['a', 'b', 'c'];
for (i, c) in letters.iter().enumerate() {
println!("{} -> {}", i, c);
}
}zip: одновременно обрабатываем два итератора
zip объединяет элементы двух итераторов в пары. Он останавливается, когда заканчиваются элементы более короткого итератора.
Это удобно для объединения параллельных данных, например имён и оценок.
fn main() {
let names = vec!["Ana", "Ben"];
let ages = vec![30, 25];
for (name, age) in names.iter().zip(ages.iter()) {
println!("{} is {}", name, age);
}
}rev: меняем порядок на обратный
rev выдаёт элементы с конца к началу. Для этого нужен двунаправленный итератор, который предоставляют диапазоны и срезы.
fn main() {
let backwards: Vec<i32> = (1..=5).rev().collect();
println!("{:?}", backwards);
}chain: объединяем два итератора
chain полностью обрабатывает первый итератор, а затем продолжает работу со вторым, как будто они образуют одну последовательность.
fn main() {
let joined: Vec<i32> = (1..=3).chain(10..=12).collect();
println!("{:?}", joined);
}fold: создаём одно значение
fold — универсальный потребитель. Он начинает с аккумулятора и сворачивает в него каждый элемент с помощью замыкания.
Многие потребители, например sum, являются частными случаями fold.
fn main() {
let product = (1..=5).fold(1, |acc, x| acc * x);
println!("5! = {}", product);
}any и all: логические потребители
any возвращает true, если предикату соответствует хотя бы один элемент; all возвращает true, только если ему соответствуют все элементы.
Оба метода прерывают работу досрочно: они останавливаются, как только ответ становится известен.
fn main() {
let nums = vec![2, 4, 6, 7];
println!("{}", nums.iter().all(|x| x % 2 == 0));
println!("{}", nums.iter().any(|x| x % 2 != 0));
}find и position
find возвращает первый элемент, соответствующий предикату, в виде Option. position вместо этого возвращает индекс первого совпадения.
Оба метода останавливаются при первом найденном совпадении.
fn main() {
let nums = vec![1, 3, 5, 8, 9];
println!("{:?}", nums.iter().find(|&&x| x % 2 == 0));
println!("{:?}", nums.iter().position(|&x| x % 2 == 0));
}Проектирование конвейеров
Стройте конвейеры, объединяя адаптеры и завершая цепочку одним потребителем. Сохраняйте читаемость: одна операция на строку.
Поскольку адаптеры ленивы, даже длинные цепочки выполняют только один проход по данным.
Быстрая проверка
Адаптеры и потребители.
Повторение
Вы изучили объединение операций в цепочки:
- Адаптеры (
take,skip,enumerate,zip,rev,chain) остаются ленивыми - Потребители (
fold,any,all,find,position) завершают обработку - Логические потребители и потребители для поиска прерывают работу досрочно
- Каждый конвейер состоит из адаптеров, за которыми следует один потребитель
Изучай Rust с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 39
- Уроки
- 144
Часто задаваемые вопросы
Урок «Адаптеры и потребители» бесплатный?
Да — полный текст урока «Адаптеры и потребители» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Адаптеры и потребители»?
Цепочки операций Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Адаптеры и потребители»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Трейт Iterator
- map, filter, collect
- Адаптеры и потребители
- Пользовательские итераторы