Курс 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 →
💪 Або перейдіть одразу до вправ цього
розділу.