Learn Rust Coding · Урок

Адаптеры и потребители

Цепочки операций

Урок 3 из 413 шагов

«Адаптеры и потребители» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Трейт Iterator
  2. map, filter, collect
  3. Адаптеры и потребители
  4. Пользовательские итераторы
← Назад к Learn Rust Coding