Курс по 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. Gather до запълване

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

Решение: Съпоставяне по тип   |   Повторете всяко число