Курс языка программирования 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): он собирает все оставшиеся аргументы.
Поглощающий массив, записываемый как *@, собирает любое
количество позиционных аргументов в массив:
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 упражнения. Прежде чем приступать к практике, изучите все темы раздела.