Понимание списка — синтаксический сахар для циклического перебора перечислимых в эликсире. В этой главе мы будем использовать понимания для итерации и генерации.
основы
Когда мы посмотрели на модуль 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, чтобы легко удалить все пробелы в строке —
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
Когда приведенный выше код выполняется, он дает следующий результат —
helloworld
Приведенный выше код удаляет все пробелы из строки с помощью фильтра c! =? \ S, а затем с помощью параметра: into помещает все возвращаемые символы в строку.