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

  1. Оптовая цена
  2. Абсолютное значение
  3. Классификация размера

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

Тест — Вызов через двоеточие   |   Оптовая цена