Курс по 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 упражнения. Разгледайте всички теми в раздела, преди да се захванете с практиката.