Курс языка программирования Raku / Продвинутый уровень / Порядок выполнения / gather и take / Exercises / Собирать до заполнения

Решение: Собирать до заполнения

Вот возможное решение задачи.

Код

my $sum = 0;
my @result = gather for 1..100 {
    $sum += $_;
    last if $sum > 10;
    take $_;
}

say @result;

🦋 Исходный код можно найти в файле gather-big.raku.

Вывод

[1 2 3 4]

Комментарии

  1. Циклу задан диапазон из ста чисел — гораздо больше, чем он использует. Это нормально, потому что цикл останавливается сам: как только $sum превышает 10, last прерывает выполнение, и остальные числа не обрабатываются.

  2. Порядок внутри блока важен. Сначала мы прибавляем к $sum и проверяем предел перед тем, как взять значение, поэтому число, которое превышает 10 (здесь 5), не попадает в список. Накопленная сумма достигает ровно 10 после 4, поэтому собранный список — 1, 2, 3, 4.

  3. Этот досрочный выход с for — это то, что может сделать gather/take и не может grep: grep всегда проходит весь список, а здесь мы сами решаем, когда остановиться.

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

Собирать до заполнения   |   Тест — gather