Corso di Raku / Avanzato / Subroutine

Firme

Nella parte Essentials hai definito subroutine con parametri posizionali e nominati e hai assegnato loro valori predefiniti. La lista dei parametri si chiama signature. Questa sezione aggiunge altre due cose che una signature può fare: contrassegnare un parametro come opzionale e raccogliere un numero qualsiasi di argomenti aggiuntivi.

Parametri opzionali

Un parametro seguito da un punto interrogativo è opzionale: il chiamante può ometterlo. Quando viene omesso, il parametro è indefinito, quindi puoi fornire un valore di riserva con l’operatore defined-or //:

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

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

Quando greet viene chiamata con un solo argomento, $greeting è indefinito, quindi // ricade su 'Hello'.

Parametri slurpy

Un parametro contrassegnato con * è slurpy: raccoglie tutti gli argomenti rimanenti. Un array slurpy, scritto *@, raccoglie qualsiasi numero di argomenti posizionali in un array:

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

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

Puoi combinare parametri ordinari con uno slurpy. I parametri fissi vengono riempiti per primi e tutto ciò che rimane va nell’array slurpy:

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

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

Allo stesso modo, un hash slurpy, scritto *%, raccoglie qualsiasi argomento nominato aggiuntivo in un hash:

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

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

I due argomenti nominati finiscono come chiavi di %options, quindi il programma stampa:

Anna: 2 option(s)
role is admin

Pratica

Risolvi 1 quiz sul contenuto di questo argomento.

Esercizi

Questa sezione contiene 3 esercizi. Guarda tutti gli argomenti di questa sezione prima di iniziare gli esercizi.

  1. Somma di tutti gli argomenti
  2. Un esponente opzionale
  3. Argomenti nominati slurpy

Subroutine   |   Somma di tutti gli argomenti