Cursus Raku / Geavanceerd / Subroutines

Signaturen

In het onderdeel Essentials heb je subroutines gedefinieerd met positionele en benoemde parameters en hun standaardwaarden ingesteld. De lijst van parameters wordt de signatuur genoemd. In dit onderdeel worden twee extra mogelijkheden van signaturen behandeld: een parameter als optioneel markeren, en een willekeurig aantal extra argumenten verzamelen.

Optionele parameters

Een parameter gevolgd door een vraagteken is optioneel: de aanroeper mag hem weglaten. Wanneer hij wordt weggelaten, is de parameter ongedefinieerd, dus kun je een terugvalwaarde opgeven met de defined-or-operator //:

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

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

Wanneer greet met een argument wordt aangeroepen, is $greeting ongedefinieerd, dus valt // terug op 'Hello'.

Slurpy parameters

Een parameter gemarkeerd met een * is slurpy: hij verzamelt alle overige argumenten. Een slurpy array, geschreven als *@, verzamelt een willekeurig aantal positionele argumenten in een array:

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

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

Je kunt gewone parameters combineren met een slurpy parameter. De vaste parameters worden eerst ingevuld, en wat overblijft gaat naar de slurpy array:

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

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

Op dezelfde manier verzamelt een slurpy hash, geschreven als *%, alle extra benoemde argumenten in een hash:

sub register($name, *%options) {
    say "$name: {%options.elems} option(s)";
    say "role is %options<role>";
}

register('Anna', role => 'admin', active => True);

De twee benoemde argumenten komen terecht als sleutels van %options, dus het programma drukt af:

Anna: 2 option(s)
role is admin

Praktijk

Maak de 1 quiz over de inhoud van dit onderwerp.

Oefeningen

Deze sectie bevat 3 oefeningen. Bekijk alle onderwerpen van deze sectie voordat je aan de oefeningen begint.

  1. Alle argumenten optellen
  2. Een optionele exponent
  3. Slurpy benoemde argumenten

Cursusnavigatie

Subroutines   |   Alle argumenten optellen