Курс 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


💪 Або перейдіть одразу до вправ цього розділу.