Курс Raku / Розширені / Підпрограми
Сигнатури
У частині «Основи» ви визначали підпрограми з позиційними та іменованими параметрами й давали їм типові значення. Список параметрів називають сигнатурою. Цей розділ додає ще дві речі, які сигнатура вміє: позначати параметр необов’язковим і збирати будь-яку кількість зайвих аргументів.
Необов’язкові параметри
Параметр, за яким стоїть знак питання, є необов’язковим:
той, хто викликає, може його пропустити. Коли його пропущено, параметр
невизначений, тож запасне значення можна підставити оператором
«визначене або» //:
sub greet($name, $greeting?) {
my $g = $greeting // 'Hello';
say "$g, $name!";
}
greet('Anna'); # Hello, Anna!
greet('Anna', 'Hi'); # Hi, Anna!Коли greet викликано з одним аргументом,
$greeting невизначений, тож // вдається до
'Hello'.
Всеїдні параметри
Параметр, позначений *, є всеїдним: він збирає
всі решту аргументів. Всеїдний масив, який записують як *@,
збирає будь-яку кількість позиційних аргументів у масив:
sub count-them(*@items) {
say @items.elems;
}
count-them(1, 2, 3, 4); # 4
count-them('a', 'b'); # 2Звичайні параметри можна поєднувати із всеїдним. Спершу заповнюються сталі параметри, а все, що лишилося, потрапляє у всеїдний масив:
sub titles($name, *@titles) {
say "$name has {@titles.elems} title(s)";
}
titles('Anna', 'Dr', 'Prof'); # Anna has 2 title(s)Так само всеїдний хеш, який записують як *%, збирає всі
зайві іменовані аргументи в хеш:
sub register($name, *%options) {
say "$name: {%options.elems} option(s)";
say "role is %options<role>";
}
register('Anna', role => 'admin', active => True);Два іменовані аргументи стають ключами %options, тож
програма виводить:
Anna: 2 option(s)
role is adminПрактика
Виконайте 1 тест за змістом цієї теми.
Вправи
У цьому розділі 3 вправи. Перш ніж братися до практики, вивчіть усі теми розділу.