Курс языка программирования 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]Комментарии
Циклу задан диапазон из ста чисел — гораздо больше, чем он использует. Это нормально, потому что цикл останавливается сам: как только
$sumпревышает10,lastпрерывает выполнение, и остальные числа не обрабатываются.Порядок внутри блока важен. Сначала мы прибавляем к
$sumи проверяем предел перед тем, как взять значение, поэтому число, которое превышает10(здесь5), не попадает в список. Накопленная сумма достигает ровно10после4, поэтому собранный список —1, 2, 3, 4.Этот досрочный выход с
for— это то, что может сделатьgather/takeи не можетgrep:grepвсегда проходит весь список, а здесь мы сами решаем, когда остановиться.