Corso di Raku / Avanzato / Controllo di flusso

gather e take

La coppia gather e take e un modo flessibile per costruire una lista. Si racchiude del codice in un blocco gather, e ogni volta che quel codice chiama take, il valore viene aggiunto alla lista che gather produce.

my @result = gather {
    take 1;
    take 2;
    take 3;
};

say @result; # [1 2 3]

Le tre chiamate a take contribuiscono tre valori, e gather li raccoglie nella lista memorizzata in @result.

La vera forza di questa coppia si manifesta quando le chiamate a take sono distribuite nel normale flusso di controllo, come un ciclo con una condizione. La lista contiene allora solo i valori che si e scelto di prendere:

my @evens = gather for 1..10 {
    take $_ if $_ %% 2;
};

say @evens; # [2 4 6 8 10]

Qui il ciclo itera sui numeri da 1 a 10, ma solo quelli pari vengono presi, quindi @evens finisce per contenere 2, 4, 6, 8, 10. (L’operatore %% verifica se un numero e divisibile in modo esatto.)

Questa separazione e cio che rende gather/take cosi utile: il codice circostante decide quando produrre un valore, e gather raccoglie silenziosamente tutto cio che viene preso.

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. Ripetere ogni numero
  2. Quadrati
  3. Raccogliere fino al pieno

Soluzione: Matching per tipo   |   Ripetere ogni numero