Курс по Raku / Напреднали / Управление на потока / Префикси на инструкции 🆕

Мързеливост и нетърпеливост

Някои списъци в Raku се изчисляват само когато техните елементи са необходими — те са мързеливи (lazy). Префиксите 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


💪 Или преминете направо към упражненията в този раздел.