Курс по Raku / Напреднали / Подпрограми

Сигнатури

В частта „Основи” вие дефинирахте подпрограми с позиционни и именувани параметри и им задавахте стойности по подразбиране. Списъкът от параметри се нарича сигнатура. Този раздел добавя две нови неща, които една сигнатура може да прави: да маркира параметър като незадължителен и да събира произволен брой допълнителни аргументи.

Незадължителни параметри

Параметър, следван от въпросителен знак, е незадължителен: извикващият може да го пропусне. Когато е пропуснат, параметърът е недефиниран, така че можете да зададете резервна стойност с оператора defined-or //:

sub greet($name, $greeting?) {
    my $g = $greeting // 'Hello';
    say "$g, $name!";
}

greet('Anna');           # Hello, Anna!
greet('Anna', 'Hi');     # Hi, Anna!

Когато greet е извикана с един аргумент, $greeting е недефинирана, така че // използва резервната стойност 'Hello'.

Slurpy параметри

Параметър, маркиран с *, е slurpy: той събира всички останали аргументи. Slurpy масив, записан като *@, събира произволен брой позиционни аргументи в масив:

sub count-them(*@items) {
    say @items.elems;
}

count-them(1, 2, 3, 4); # 4
count-them('a', 'b');   # 2

Можете да комбинирате обикновени параметри със slurpy. Фиксираните параметри се попълват първи, а каквото остане, отива в slurpy масива:

sub titles($name, *@titles) {
    say "$name has {@titles.elems} title(s)";
}

titles('Anna', 'Dr', 'Prof'); # Anna has 2 title(s)

По същия начин slurpy хеш, записан като *%, събира всички допълнителни именувани аргументи в хеш:

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 именувани аргументи

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

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