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

  1. Сумма всех аргументов
  2. Необязательная степень
  3. Поглощающие именованные аргументы

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

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