Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Реактивно програмиране / react и whenever / Exercises / Два whenever

Решение: Два whenever

Ето едно възможно решение на задачата.

Код

my $deposits    = Supply.from-list(100, 50, 200);
my $withdrawals = Supply.from-list(30, 120);

my $balance = 0;

react {
    whenever $deposits    { $balance += $_ }
    whenever $withdrawals { $balance -= $_ }
}

say $balance;

🦋 Намерете програмата във файла two-whenevers.raku.

Изход

200

Коментари

  1. Двата блока whenever следят двата именувани потока и откликват различно: постъпленията се добавят, тегленията се изваждат. Един блок react, две струи, две отчетливо различни реакции — точно заради това се държи по един whenever на източник.

  2. Блокът react приключва едва когато двата потока свършат, така че салдото е окончателно още преди отпечатването: 100 + 50 + 200 - 30 - 120 дава 200. Понеже събирането и изваждането комутират, преплитането на двете струи не влияе на резултата.

  3. Тук и двата потока подават стойностите си мигновено, една струя след друга. В живота събитията по банкова сметка пристигат разтеглени във времето — постъпление сега, теглене след час — и двете струи се сплитат, както в демонстрацията Два таймера. Кодът остава точно същият: блокът react изпълнява онова тяло на whenever, което отговаря на всяко събитие в момента на пристигането му.

Навигация в курса

Два whenever   |   await