Учебники

Эликсир — Понимание

Понимание списка — синтаксический сахар для циклического перебора перечислимых в эликсире. В этой главе мы будем использовать понимания для итерации и генерации.

основы

Когда мы посмотрели на модуль Enum в главе enumerables, мы натолкнулись на функцию map.

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

В этом примере мы передадим функцию в качестве второго аргумента. Каждый элемент в диапазоне будет передан в функцию, а затем будет возвращен новый список, содержащий новые значения.

Картирование, фильтрация и преобразование являются очень распространенными действиями в Elixir, и поэтому существует несколько иной способ достижения того же результата, что и в предыдущем примере —

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

Когда мы запускаем приведенный выше код, он дает следующий результат —

[2, 4, 6]

Второй пример — это понимание, и, как вы, вероятно, можете видеть, это просто синтаксический сахар для того, чего вы также можете достичь, если используете функцию Enum.map . Тем не менее, нет никаких реальных преимуществ использования понимания по сравнению с функцией из модуля Enum с точки зрения производительности.

Понимания не ограничиваются списками, но могут использоваться со всеми перечислимыми.

Фильтр

Вы можете думать о фильтрах как о некоей страже понимания. Когда отфильтрованное значение возвращает false или nil, оно исключается из окончательного списка. Давайте переберем диапазон и будем беспокоиться только о четных числах. Мы будем использовать функцию is_even из модуля Integer, чтобы проверить, является ли значение четным или нет.

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

Когда приведенный выше код выполняется, он дает следующий результат —

[2, 4, 6, 8, 10]

Мы также можем использовать несколько фильтров в одном понимании. Добавьте еще один фильтр после фильтра is_even, разделенного запятой.

: в вариант

В приведенных выше примерах все понимания возвращали списки в качестве результата. Тем не менее, результат понимания может быть вставлен в различные структуры данных путем передачи опции : into в понимание.

Например, генератор цепочки битов может использоваться с опцией: into, чтобы легко удалить все пробелы в строке —

Live Demo

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

Когда приведенный выше код выполняется, он дает следующий результат —

helloworld

Приведенный выше код удаляет все пробелы из строки с помощью фильтра c! =? \ S, а затем с помощью параметра: into помещает все возвращаемые символы в строку.