Elixir - Compréhensions

Les compréhensions de listes sont du sucre syntaxique pour parcourir les énumérables dans Elixir. Dans ce chapitre, nous utiliserons les compréhensions pour l'itération et la génération.

Basiques

Quand nous avons regardé le module Enum dans le chapitre énumérables, nous sommes tombés sur la fonction map.

Enum.map(1..3, &(&1 * 2))

Dans cet exemple, nous passerons une fonction comme deuxième argument. Chaque élément de la plage sera passé dans la fonction, puis une nouvelle liste sera renvoyée contenant les nouvelles valeurs.

La cartographie, le filtrage et la transformation sont des actions très courantes dans Elixir et il existe donc une manière légèrement différente d'obtenir le même résultat que l'exemple précédent -

for n <- 1..3, do: n * 2

Lorsque nous exécutons le code ci-dessus, il produit le résultat suivant -

[2, 4, 6]

Le deuxième exemple est une compréhension, et comme vous pouvez probablement le voir, il s'agit simplement de sucre syntaxique pour ce que vous pouvez également réaliser si vous utilisez le Enum.mapfonction. Cependant, il n'y a pas de réel avantage à utiliser une compréhension sur une fonction du module Enum en termes de performances.

Les compréhensions ne sont pas limitées aux listes mais peuvent être utilisées avec tous les énumérables.

Filtre

Vous pouvez considérer les filtres comme une sorte de garde pour les compréhensions. Lorsqu'une valeur filtrée revientfalse ou nilil est exclu de la liste finale. Passons en boucle sur une plage et ne nous préoccupons que des nombres pairs. Nous utiliserons leis_even fonction du module Integer pour vérifier si une valeur est paire ou non.

import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)

Lorsque le code ci-dessus est exécuté, il produit le résultat suivant -

[2, 4, 6, 8, 10]

Nous pouvons également utiliser plusieurs filtres dans la même compréhension. Ajoutez un autre filtre de votre choix après leis_even filtre séparé par une virgule.

: en option

Dans les exemples ci-dessus, toutes les compréhensions ont renvoyé des listes comme résultat. Cependant, le résultat d'une compréhension peut être inséré dans différentes structures de données en passant le:into option à la compréhension.

Par exemple, un bitstring générateur peut être utilisé avec l'option: into afin de supprimer facilement tous les espaces d'une chaîne -

IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)

Lorsque le code ci-dessus est exécuté, il produit le résultat suivant -

helloworld

Le code ci-dessus supprime tous les espaces de la chaîne en utilisant c != ?\s filter puis en utilisant l'option: into, il met tous les caractères retournés dans une chaîne.