Elixir - Comprensiones
Las listas por comprensión son un azúcar sintáctico para recorrer los enumerables en Elixir. En este capítulo usaremos comprensiones para iteración y generación.
Lo esencial
Cuando miramos el módulo Enum en el capítulo de enumerables, encontramos la función de mapa.
Enum.map(1..3, &(&1 * 2))
En este ejemplo, pasaremos una función como segundo argumento. Cada elemento del rango se pasará a la función y luego se devolverá una nueva lista que contiene los nuevos valores.
Mapear, filtrar y transformar son acciones muy comunes en Elixir, por lo que hay una forma ligeramente diferente de lograr el mismo resultado que en el ejemplo anterior
for n <- 1..3, do: n * 2
Cuando ejecutamos el código anterior, produce el siguiente resultado:
[2, 4, 6]
El segundo ejemplo es una comprensión, y como probablemente pueda ver, es simplemente azúcar sintáctico para lo que también puede lograr si usa el Enum.mapfunción. Sin embargo, no hay beneficios reales de usar una comprensión sobre una función del módulo Enum en términos de rendimiento.
Las comprensiones no se limitan a listas, sino que se pueden usar con todos los enumerables.
Filtrar
Puede pensar en los filtros como una especie de guardia para las comprensiones. Cuando regresa un valor filtradofalse o nilestá excluido de la lista final. Recorramos un rango y solo nos preocupemos por los números pares. Usaremos elis_even función del módulo Integer para comprobar si un valor es par o no.
import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
[2, 4, 6, 8, 10]
También podemos utilizar varios filtros en la misma comprensión. Agregue otro filtro que desee después delis_even filtro separado por una coma.
: en Opción
En los ejemplos anteriores, todas las comprensiones devolvieron listas como resultado. Sin embargo, el resultado de una comprensión se puede insertar en diferentes estructuras de datos pasando el:into opción a la comprensión.
Por ejemplo, un bitstring El generador se puede usar con la opción: into para eliminar fácilmente todos los espacios en una cadena -
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
helloworld
El código anterior elimina todos los espacios de la cadena usando c != ?\s filter y luego usando la opción: into, coloca todos los caracteres devueltos en una cadena.