Elisir - Comprensioni
Le comprensioni delle liste sono zucchero sintattico per scorrere gli enumerabili in Elixir. In questo capitolo useremo le comprensioni per l'iterazione e la generazione.
Nozioni di base
Quando abbiamo esaminato il modulo Enum nel capitolo enumerables, ci siamo imbattuti nella funzione map.
Enum.map(1..3, &(&1 * 2))
In questo esempio, passeremo una funzione come secondo argomento. Ogni elemento nell'intervallo verrà passato alla funzione, quindi verrà restituito un nuovo elenco contenente i nuovi valori.
Mappare, filtrare e trasformare sono azioni molto comuni in Elixir e quindi esiste un modo leggermente diverso per ottenere lo stesso risultato dell'esempio precedente:
for n <- 1..3, do: n * 2
Quando eseguiamo il codice sopra, produce il seguente risultato:
[2, 4, 6]
Il secondo esempio è una comprensione e, come probabilmente puoi vedere, è semplicemente zucchero sintattico per ciò che puoi ottenere anche se usi il Enum.mapfunzione. Tuttavia, non ci sono vantaggi reali nell'usare una comprensione su una funzione del modulo Enum in termini di prestazioni.
Le comprensioni non sono limitate agli elenchi ma possono essere utilizzate con tutti gli enumerabili.
Filtro
Puoi pensare ai filtri come a una sorta di guardia per le comprensioni. Quando viene restituito un valore filtratofalse o nilè escluso dalla lista finale. Cerchiamo di scorrere un intervallo e preoccuparci solo dei numeri pari. Useremo il fileis_even funzione dal modulo Integer per verificare se un valore è pari o meno.
import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)
Quando il codice sopra viene eseguito, produce il seguente risultato:
[2, 4, 6, 8, 10]
Possiamo anche utilizzare più filtri nella stessa comprensione. Aggiungi un altro filtro che desideri dopo il fileis_even filtro separato da una virgola.
: in Opzione
Negli esempi precedenti, tutte le comprensioni hanno restituito elenchi come risultato. Tuttavia, il risultato di una comprensione può essere inserito in diverse strutture dati passando il:into opzione alla comprensione.
Ad esempio, a bitstring generatore può essere utilizzato con l'opzione: into per rimuovere facilmente tutti gli spazi in una stringa -
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
Quando il codice sopra viene eseguito, produce il seguente risultato:
helloworld
Il codice precedente rimuove tutti gli spazi dalla stringa utilizzando c != ?\s filter e quindi utilizzando l'opzione: into, inserisce tutti i caratteri restituiti in una stringa.