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


💪 Или преминете направо към упражненията в този раздел.