Raku kurss / Pielikums 🆕 / Plūsma un funkcijas / Apakšprogrammas un funkcionālais stils / Exercises / Augošs uzkrājējs

Risinājums: Augošs uzkrājējs

Šeit ir iespējams risinājums uzdevumam.

Kods

sub make-accumulator($start) {
    my $total = $start;
    return -> $amount { $total += $amount };
}

my $acc = make-accumulator(100);

say $acc(10);
say $acc(25);
say $acc(-5);

🦋 Atrodiet programmu failā accumulator.raku.

Izvade

110
135
130

Komentāri

  1. Atgrieztais bloks noslēdzas pār $total: šis mainīgais dzīvo starp izsaukumiem, tāpēc katrs izsaukums atceras iepriekšējā summu.

  2. $total += $amount gan atjaunina augošo summu, gan to atgriež, un tieši to izdrukā katrs say: 110, tad 135, tad 130.

  3. Cits variants summu tur paša bloka iekšienē, state mainīgajā. Atšķirībā no parasta my state mainīgais tiek inicializēts tikai vienreiz — pirmajā bloka izpildes reizē — un tad savu vērtību patur turpmākajos izsaukumos:

    sub make-accumulator($start) {
        return -> $amount { state $total = $start; $total += $amount };
    }
    
    my $acc = make-accumulator(100);
    say $acc(10);
    say $acc(25);
    say $acc(-5);

    Katrs make-accumulator izsaukums rada svaigu bloku ar savu state $total, tāpēc atsevišķi uzkrājēji paliek neatkarīgi — un slēgums pār $start katram joprojām piegādā savu sākuma vērtību.

Kursa navigācija

Augošs uzkrājējs   |   Pāra skaitļu kvadrātu summa