Raku-Kurs / Fortgeschritten / Mehr über eingebaute Typen / Sets, Bags und Mixes

Bags und Mixes

Ein Set merkt sich nur, ob ein Wert vorhanden ist. Manchmal möchtest du aber auch wissen, wie oft er vorkommt. Dafür gibt es den Bag: Er speichert einen Zähler für jeden Wert.

Du erstellst einen Bag mit der bag-Routine. Wiederholte Werte werden nicht zusammengefasst — sie werden gezählt:

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

Wenn du den Bag mit dem < >-Subscript nach einem Wert fragst, erhältst du zurück, wie oft dieser Wert eingefügt wurde. Die Methode total gibt die Summe aller Zähler zurück:

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

Ein Mix ist dieselbe Idee wie ein Bag, nur dass die Zähler (genannt Gewichte) auch Bruchzahlen sein können. Um explizite Gewichte zuzuweisen, ordne jedem Wert sein Gewicht als Paar zu und wandle die Liste mit .Mix um:

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

Das Nachschlagen eines Gewichts mit < > und das Summieren mit total funktionieren genau wie bei einem Bag — nur müssen die Zahlen nicht ganzzahlig sein. Hier addiert total die Gewichte 2.5 und 0.75 und ergibt 3.25 — es ist die Summe der Gewichte, nicht eine Anzahl der Werte. Bags und Mixes sind praktisch, wann immer du Mengen verfolgen musst — zum Beispiel, um zu zählen, wie oft jedes Wort in einem Text vorkommt, oder um Optionen mit Gewichten zu versehen.

Kursnavigation

Quiz — Sets   |   Die unterschiedlichen zählen


💪 Oder springen Sie direkt zu den Übungen dieses Abschnitts.