Курс 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. Класифікувати розмір

Навігація курсом

Тест — Виклик через двокрапку   |   Оптові ціни