Курс по Raku / Напреднали / Повече за вградените типове / Множества, торби и смеси

Торби и смеси

Множеството запомня само дали дадена стойност присъства. Понякога искате да знаете и колко пъти се среща. Точно за това служи Bag: той пази брояч за всяка стойност.

Създавате торба с подпрограмата bag. Повтарящите се стойности не се свиват — те се броят:

my $b = bag(<a b a c a>);
say $b<a>; # 3
say $b<b>; # 1

Когато поискате стойност от торбата с индекса < >, се връща колко пъти тази стойност е била добавена. Методът total дава сумата на всички броячи:

say bag(<a b a c a>).total; # 5

Mix е същата идея като торбата, с тази разлика, че броячите (наречени тегла) могат да бъдат дробни, а не само цели числа. За да зададете изрични тегла, свържете всяка стойност с нейното тегло и преобразувайте списъка с .Mix:

my $m = (flour => 2.5, sugar => 0.75).Mix;
say $m<flour>; # 2.5
say $m.total;  # 3.25

Търсенето на тегло с < > и сумирането им с total работят точно както при торбата — само че числата не е задължително да са цели. Тук total събира теглата 2.5 и 0.75, като дава 3.25 — това е сумата на теглата, а не брой на стойностите. Торбите и смесите са удобни, когато трябва да следите количества — например да броите колко пъти се появява всяка дума в текст или да задавате тегла на опции.

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

Тест — Множества   |   Пребройте уникалните


💪 Или преминете направо към упражненията в този раздел.