Курс языка программирования 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 тест по содержанию этой темы.

Навигация по курсу

Тест — Оператор конвейера   |   Тест — Конвейеры


💪 Или перейдите сразу к упражнениям этого раздела.