Kurso de Raku / Funkcia, samtempa, reaktiva kaj reta programado / Funkcia programado / Generiloj
Maldiligenta gather
Bloko gather estas maldiligenta: ĝi ne
plenumiĝas tuj tutece. Ĝi produktas valorojn nur kiam ili estas tirataj
eksteren, kio signifas, ke gather povas priskribi
senfinan serion kaj tamen esti utila — vi simple ĉesas
preni valorojn, kiam vi havas sufiĉe.
La kaptilo estas, ke vi devas teni la rezulton maldiligenta. Konservi
ĝin en simpla @array provus kolekti ĉiun valoron tuj, kaj
por senfina serio tio neniam finiĝus. Anstataŭe, tenu la sekvencon en
skalaro (kie ĝi restas maldiligenta Seq) kaj tiru tranĉaĵon
el ĝi:
my $naturals = gather {
my $n = 1;
loop {
take $n++;
}
}
say $naturals[^5]; # (1 2 3 4 5)La loop neniam finiĝas, sed nur kvin valoroj estas iam
produktataj, ĉar tio estas ĉio, kion ni petis per [^5]. Vi
povas ankaŭ tiri de la komenco per .head:
say (gather { my $n = 1; loop { take $n++ } }).head(3); # (1 2 3)Maldiligenteco estas tio, kio ebligas al gather modeli
senfinajn fluojn sekure: nenio estas kalkulata antaŭ ol ĝi estas
bezonata, kaj vi prenas ĝuste tiom, kiom vi volas.
Kursa navigado
← Kvizo — gather kaj take | Kolektu la kubojn →
💪 Aŭ iru rekte al la ekzercoj de ĉi tiu
sekcio.