Kurso de Raku / Funkcia, samtempa, reaktiva kaj reta programado / Funkcia programado / Iterviloj
Verki itervilon
Itervilo estas simple objekto, kiu plenumas la enkonstruitan rolon
Iterator kaj provizas metodon pull-one. Tiu
metodo redonas la sekvan valoron, aŭ IterationEnd, kiam
nenio restas. Jen retronombra itervilo, kiu liveras nombron kaj paŝas al
nulo:
class Countdown does Iterator {
has Int $.n is rw;
method pull-one {
return IterationEnd if $!n <= 0;
return $!n--;
}
}Ĉiu voko de pull-one unue kontrolas, ĉu la nombrado
elĉerpiĝis; se ne, ĝi redonas la kurantan nombron kaj malpliigas ĝin. La
postmalpliigo $!n-- redonas la valoron antaŭ la
subtraho, do la nombroj eliras kiel 3, 2, 1. Konduki ĝin
mane aspektas ĝuste kiel ĉe ajna alia itervilo:
my $c = Countdown.new(n => 3);
say $c.pull-one; # 3
say $c.pull-one; # 2
say $c.pull-one; # 1
say $c.pull-one =:= IterationEnd; # TrueItervilo per si mem ne estas io, kion buklo for povas
preni rekte — buklo atendas iterablon. Envolvu la itervilon en
Seq kaj ĝi fariĝas buklo-irebla:
for Seq.new(Countdown.new(n => 3)) -> $x {
say $x;
}Tio presas 3, 2, 1. En ĉiutaga
kodo vi prefere uzus gather / take — la generila formo estas multe pli
mallonga por la sama rezulto. Skribi la rolon Iterator
rekte tamen indas vidi unufoje, ĉar ĝi malkaŝas, sur kio
gather, map kaj ĉiu buklo for
estas konstruitaj: objekto, kiu respondas unu solan demandon — «kio
estas la sekva valoro?»
Kursa navigado
← Kvizo — La protokolo de iterviloj | Sumi per pull-one →
💪 Aŭ iru rekte al la ekzerco de
ĉi tiu sekcio.