Курс по Raku / Напреднали / Подпрограми
Множествена диспечеризация
В частта „Основи” се запознахте с мулти-функциите: няколко подпрограми, които споделят едно и също име, като Raku избира правилната, като разглежда типовете на аргументите. Този механизъм се нарича множествено диспечиране (multiple dispatch).
Досега изборът се правеше по типа на аргументите. Клаузата
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 упражнения. Разгледайте всички теми в раздела, преди да се захванете с практиката.