Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Функциональное программирование / Конвейеры данных
Цепочки конвейеров
Настоящая ценность конвейеров проявляется, когда ступеней несколько.
Каждый ==> передаёт свой результат следующей операции,
поэтому весь конвейер читается сверху вниз в том порядке, в каком идёт
работа:
(1..10)
==> grep(* %% 2)
==> map(* ** 2)
==> my @result;
say @result; # [4 16 36 64 100]Проследите за данными вниз по странице: начинаем с
1..10, оставляем чётные числа, возводим каждое в квадрат и
собираем результат. Чётные числа — это 2, 4, 6, 8, 10, а их
квадраты — 4, 16, 36, 64, 100.
Записанный цепочкой методов, тот же конвейер выглядит как
(1..10).grep(* %% 2).map(* ** 2) — и читается он слева
направо ровно так же, как конвейер. Цепочка методов не «выворачивается
наизнанку»: её ступени выполняются в том же самом порядке. По-настоящему
наизнанку читается вложение операций в виде обычных функций,
map(* ** 2, grep(* %% 2, 1..10)), где приходится начинать с
самого внутреннего вызова и двигаться наружу.
Значит, конвейер — не способ убежать от кода, вывернутого наизнанку;
это другое написание того же конвейера слева направо. Что он добавляет,
так это расположение: каждая ступень ==> может стоять на
своей строке, и один и тот же оператор одинаково работает и для шагов в
стиле методов, и для шагов в стиле функций, — а от этого длинный
конвейер остаётся лёгким для просмотра. В конечном счёте конвейеры и
цепочки методов делают одну работу; выбирайте то, что делает конкретное
преобразование понятнее.
Практика
Пройдите 1 тест по содержанию этой темы.
Навигация по курсу
← Тест — Оператор конвейера | Тест — Конвейеры →
💪 Или перейдите сразу к упражнениям этого
раздела.