Курс языка программирования Raku / Продвинутый уровень / Порядок выполнения

gather и take

Пара gather и take — это гибкий способ построения списка. Вы оборачиваете некоторый код в блок gather, и каждый раз, когда этот код вызывает take, значение добавляется в список, который создаёт gather.

my @result = gather {
    take 1;
    take 2;
    take 3;
};

say @result; # [1 2 3]

Три вызова take дают три значения, и gather собирает их в список, сохранённый в @result.

Настоящая сила этой пары проявляется, когда вызовы take распределены по обычному потоку управления, например в цикле с условием. Тогда список содержит только те значения, которые вы решили взять:

my @evens = gather for 1..10 {
    take $_ if $_ %% 2;
};

say @evens; # [2 4 6 8 10]

Здесь цикл проходит по числам от 1 до 10, но берутся только чётные, поэтому @evens содержит 2, 4, 6, 8, 10. (Оператор %% проверяет, делится ли число нацело.)

Это разделение и делает gather/take таким удобным: окружающий код решает, когда создать значение, а gather тихо собирает всё, что было взято.

Практика

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

Упражнения

В этом разделе 3 упражнения. Прежде чем приступать к практике, изучите все темы раздела.

  1. Повторение каждого числа
  2. Квадраты
  3. Собирать до заполнения

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

Решение: Сопоставление по типу   |   Повторение каждого числа