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

  1. Сума всіх аргументів
  2. Необов’язковий степінь
  3. Slurpy іменовані аргументи

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

Підпрограми   |   Сума всіх аргументів