Raku kurss / Funkcionālā, paralēlā, reaktīvā un tīmekļa programmēšana / Funkcionālā programmēšana / Ģeneratori

Slinkais gather

gather bloks ir slinks: tas neizpildās viss uzreiz. Tas rada vērtības tikai tad, kad tās tiek izvilktas, un tas nozīmē, ka gather var aprakstīt bezgalīgu rindu un tomēr būt noderīgs — jūs vienkārši pārstājat ņemt vērtības, kad jums ir pietiekami.

Āķis ir tāds, ka rezultāts jāpatur slinks. Glabājot to parastā @array, tiktu mēģināts savākt visas vērtības uzreiz, un bezgalīgai rindai tas nekad nebeigtos. Tā vietā glabājiet virkni skalārā (kur tā paliek slinka Seq) un izvelciet no tās šķēli:

my $naturals = gather {
    my $n = 1;
    loop {
        take $n++;
    }
}

say $naturals[^5]; # (1 2 3 4 5)

loop nekad nebeidzas, bet tiek radītas tikai piecas vērtības, jo tieši tik daudz mēs prasījām ar [^5]. Vilkt no priekšgala var arī ar .head:

say (gather { my $n = 1; loop { take $n++ } }).head(3); # (1 2 3)

Tieši slinkums ļauj gather droši modelēt bezgalīgas straumes: nekas netiek aprēķināts, kamēr nav vajadzīgs, un jūs paņemat tieši tik, cik gribat.

Kursa navigācija

Viktorīna — gather un take   |   Savāciet kubus


💪 Vai arī dodieties tieši uz šīs sadaļas vingrinājumiem.