Курс языка программирования 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 упражнения. Прежде чем приступать к практике, изучите все темы раздела.