Курс по 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 →
💪 Или преминете направо към упражненията в този
раздел.