Corso di Raku / Avanzato / Subroutine

Dispatch multiplo

Nella parte Essenziali hai incontrato le multi-funzioni: diverse subroutine che condividono lo stesso nome, dove Raku sceglie quella giusta in base ai tipi degli argomenti. Questo meccanismo si chiama multiple dispatch.

Finora la scelta veniva fatta in base al tipo degli argomenti. Una clausola where permette di andare oltre e effettuare il dispatch anche in base al valore. Si scrive dopo un parametro e contiene una condizione che l’argomento deve soddisfare affinche quel candidato venga scelto:

multi sub info(Int $n where $n < 0)  { say "$n is negative" }
multi sub info(Int $n where $n == 0) { say "$n is zero" }
multi sub info(Int $n where $n > 0)  { say "$n is positive" }

info(-5);
info(0);
info(7);

Ogni chiamata va al candidato la cui condizione risulta vera per il valore dato:

-5 is negative
0 is zero
7 is positive

Tutti e tre i candidati hanno la stessa firma per quanto riguarda i tipi — un singolo Int — quindi senza le clausole where entrerebbero in conflitto. Le condizioni li rendono distinti.

Un caso base per la ricorsione

Un uso comune di where e fornire il punto di arresto di una ricorsione come candidato separato. Ecco di nuovo il fattoriale, suddiviso in due multi-sub:

multi sub fact(Int $n where $n <= 1) { 1 }
multi sub fact(Int $n)               { $n * fact($n - 1) }

say fact(5); # 120

Il primo candidato gestisce il caso base ($n uguale a 1 o inferiore) e restituisce semplicemente 1. Ogni altro valore va al secondo candidato, che chiama di nuovo fact con un numero piu piccolo. Non c’e nessun if all’interno della funzione — la scelta tra caso base e passo ricorsivo viene fatta dal dispatcher.

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. Prezzo all’ingrosso
  2. Valore assoluto
  3. Classificare la dimensione

Quiz — La chiamata con due punti   |   Prezzo all’ingrosso