Raku kurss / Funkcionālā, paralēlā, reaktīvā un tīmekļa programmēšana / Funkcionālā programmēšana / Iteratori
Iteratora rakstīšana
Iterators vienkārši ir objekts, kas pilda iebūvēto lomu
Iterator un nodrošina metodi pull-one. Šī
metode atgriež nākamo vērtību vai IterationEnd, kad vairs
nekā nav palicis. Šeit ir atpakaļskaitīšanas iterators, kas atdod
skaitli un soļo pretī nullei:
class Countdown does Iterator {
has Int $.n is rw;
method pull-one {
return IterationEnd if $!n <= 0;
return $!n--;
}
}Katrs pull-one izsaukums vispirms pārbauda, vai
skaitīšana nav beigusies; ja nav, tas atgriež pašreizējo skaitli un to
samazina. Pēcsamazinājums $!n-- atgriež vērtību
pirms atņemšanas, tāpēc skaitļi iznāk 3, 2, 1.
Darbinot to ar rokām, tas izskatās gluži kā jebkurš cits iterators:
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; # TrueIteratoru pašu par sevi for cikls tieši paņemt nespēj —
cikls gaida iterējamu lietu. Ietiniet iteratoru
Seq, un tas kļūst ciklojams:
for Seq.new(Countdown.new(n => 3)) -> $x {
say $x;
}Tas izdrukā 3, 2, 1. Ikdienas
kodā jūs tā vietā ņemtu gather / take — ģeneratora forma tam pašam
rezultātam ir daudz īsāka. Tomēr Iterator lomu uzrakstīt
tieši ir vērts redzēt vienreiz, jo tas atklāj, uz kā balstās
gather, map un katrs for cikls:
uz objekta, kas atbild uz vienu vienīgu jautājumu — «kāda ir nākamā
vērtība?»
Kursa navigācija
← Viktorīna — Iteratora protokols | Summa ar pull-one →
💪 Vai arī dodieties tieši uz šīs
sadaļas vingrinājumu.