Курс Raku / Розширені / Підпрограми
Множинна диспетчеризація
У частині «Основи» ви познайомилися з мульти-функціями — кількома підпрограмами зі спільним іменем, серед яких Raku обирає потрібну, дивлячись на типи аргументів. Цей механізм називають множинною диспетчеризацією.
Досі вибір робився за типом аргументів. Речення
where дозволяє піти далі й диспетчеризувати ще й за
значенням. Воно записується після параметра й містить умову,
яку аргумент має задовольнити, щоб було обрано саме цього кандидата:
multi sub info(Int $n where $n < 0) { say "$n is negative" }
multi sub info(Int $n where $n == 0) { say "$n is zero" }
multi sub info(Int $n where $n > 0) { say "$n is positive" }
info(-5);
info(0);
info(7);Кожен виклик потрапляє до того кандидата, чия умова істинна для даного значення:
-5 is negative
0 is zero
7 is positiveУсі три кандидати мають однакову сигнатуру з погляду типів — один
Int, — тож без речень where вони конфліктували
б. Умови роблять їх різними.
Базовий випадок для рекурсії
Поширене застосування where — задати точку зупинки
рекурсії окремим кандидатом. Ось знову факторіал, розділений на дві
мульти-підпрограми:
multi sub fact(Int $n where $n <= 1) { 1 }
multi sub fact(Int $n) { $n * fact($n - 1) }
say fact(5); # 120Перший кандидат обробляє базовий випадок ($n, що
дорівнює 1 або менше) і просто повертає 1.
Кожне інше значення потрапляє до другого кандидата, який знову викликає
fact із меншим числом. Усередині функції немає жодного
if — вибір між базовим випадком і рекурсивним кроком робить
диспетчер.
Практика
Виконайте 1 тест за змістом цієї теми.
Вправи
У цьому розділі 3 вправи. Перш ніж братися до практики, вивчіть усі теми розділу.