Курс по Raku / Напреднали / Оператори / Метаоператори

Метаоператори за редукция

Метаоператорът за редукция се записва като обикновен оператор, обвит в квадратни скоби, например [+] или [*]. Той взима списък от стойности и поставя оператора между всяка двойка от тях, свивайки целия списък до една стойност.

Например [+] събира всички елементи на списък:

my @data = 3, 5, 7, 9, 11;
say [+] @data; # 35

Конструкцията [+] @data е еквивалентна на ръчно изписване на оператора:

say 3 + 5 + 7 + 9 + 11; # 35

Всеки подходящ инфиксен оператор работи по същия начин. С [*] получавате произведението на списъка, така че прилагането му върху диапазона 1..$n е удобен начин за пресмятане на факториел:

my $n = 5;
say [*] 1..$n; # 120

Тук диапазонът 1..$n генерира числата от 1 до 5, а [*] ги умножава: 1 * 2 * 3 * 4 * 5, което е 5!.

Конкатенацията на низове също работи. Редукцията [~] съединява списък от низове в един:

my @strings = <neun hundert fünf und zwanzig>;
say [~] @strings; # neunhundertfünfundzwanzig

Дори оператори за сравнение могат да бъдат редуцирани. [<] проверява дали стойностите са в строго нарастващ ред:

say [<] 1, 2, 3; # True

Триъгълна редукция

Ако поставите обратна наклонена черта вътре в скобите, получавате триъгълна редукция, която запазва всички междинни резултати, а не само крайния:

say [\+] 1..5; # (1 3 6 10 15)

Всеки елемент от резултата е частична сума: 1, после 1+2, после 1+2+3 и така нататък до сумата на целия списък.

Практика

Направете 1 тест върху съдържанието на тази тема.

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

Метаоператори   |   Тест — Редукция


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