Курс Raku / Розширені / Порядок виконання / Префікси інструкцій 🆕

Лінивість та жадібність

Деякі списки в Raku обчислюються лише в міру потреби в їхніх елементах — вони ліниві. Префікси lazy та eager дозволяють керувати цим явно.

Префікс eager змушує список бути виробленим весь одразу, негайно:

my @squares = eager (1..3).map(* ** 2);
say @squares; # [1 4 9]

Без eager map усе одно виробив би значення, але eager гарантує, що всі вони обчислюються саме тут і зараз, а не на вимогу.

Префікс lazy робить протилежне: він позначає список як лінивий, тож його елементи виробляються, лише коли їх витягують. Саме це дозволяє списку бути умоглядно нескінченним:

my $numbers = lazy (1 .. Inf);
say $numbers.is-lazy; # True

Метод .is-lazy підтверджує, що список не намагатиметься обчислити всі свої (нескінченні) елементи наперед.

Саме цей приклад є випадком, коли Raku припустив би лінивість і так: необмежений діапазон на кшталт 1 .. Inf уже лінивий, тож say (1 .. Inf).is-lazy виводить True і без префікса. Написання lazy тут нічого не змінює — воно лише робить намір явним. Префікс виправдовує себе, коли ви хочете зробити лінивим список, який інакше обчислився б жадібно.

Здебільшого Raku робить розумний вибір самотужки: діапазони й послідовності ліниві, а звичайне присвоєння масиву жадібне. Звертайтеся до цих префіксів, коли потрібно цей вибір перекрити: eager — щоб змусити дороге обчислення статися зараз, lazy — щоб відкласти те, що може виявитися великим або необмеженим.

Навігація курсом

Тест — do   |   sink та quietly


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