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

gather и take

Блок gather собирает значения. В любом месте внутри него — в том числе в циклах и вызываемых им подпрограммах — take добавляет значение в список, который порождает gather:

my @squares = gather {
    take $_ ** 2 for 1..3;
}

say @squares; # [1 4 9]

take выполняется по одному разу для каждого числа 1, 2, 3, отдавая 1, 4 и 9. Весь блок gather вычисляется в список всего, что было взято.

take может стоять под любой управляющей конструкцией, что делает gather идеальным для построения списка с условиями:

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

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

Здесь значение берётся, только когда срабатывает if, поэтому в списке оказываются лишь чётные числа. Часто это понятнее, чем собирать список вручную через push, потому что логика читается как обычный цикл, а take просто помечает значения, которые нужно оставить.

Практика

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

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

Генераторы   |   Тест — gather и take


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