Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Функциональное программирование / Конвейеры данных

Обратный конвейер

Все конвейеры до сих пор текли вперёд, через ==>, от источника слева к приёмнику справа. В Raku есть и зеркальный оператор <==обратный конвейер. Он работает в другую сторону: приёмник стоит слева, а данные притягиваются из источника справа.

Вот прежний конвейер с чётными числами, записанный в обратную сторону:

my @evens <== grep(* %% 2) <== (1..10);
say @evens; # [2 4 6 8 10]

Читайте справа налево: возьми 1..10, оставь чётные числа и собери их в @evens. Результат в точности тот же, что и у (1..10) ==> grep(* %% 2) ==> my @evens, — изменилось лишь направление, в котором вы записываете ступени.

Обратные конвейеры соединяются в цепочки так же, и приёмник снова идёт первым:

my @result <== map(* ** 2) <== grep(* %% 2) <== (1..10);
say @result; # [4 16 36 64 100]

Работа по-прежнему начинается с источника — берём 1..10, оставляем чётные, возводим в квадрат, — но на странице ступени перечислены от назначения назад к истоку. Порядок элементов не меняется: <== меняет только направление чтения, но никогда сами данные.

Поскольку код обычно читают слева направо, прямой ==> чаще читается естественнее: вы сначала встречаете данные и следуете за ними туда, где они оседают. Обратный <== существует для тех случаев, когда историю лучше рассказывать с назначения — назвав то, что вы строите, прежде того, из чего оно строится. Это точные зеркала друг друга, поэтому выбирайте направление, которое читается лучше.

Практика

Пройдите 1 тест по содержанию этой темы.

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

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


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