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