для понимания — это мощная языковая конструкция в Elixir, которая позволяет разработчикам декларативно выражать сложные итерации и условную логику. Он очень похож на цикл for других языков программирования, но обладает большей функциональностью и более лаконичным синтаксисом. Он используется для фильтрации и преобразования наборов данных и может использоваться как альтернатива рекурсивным функциям или вложенным функциям Enum
. Лично я нахожу его очень интересным и удобочитаемым, учитывая его декларативный характер.
На высоком уровне для понимания состоит из последовательности генераторов, фильтров и сборщиков. Каждый генератор представляет собой последовательность значений, и понимание перебирает эти последовательности вложенным образом. Фильтры позволяют указать условия, которые должны быть соблюдены, чтобы значение было включено в окончательный результат. Если условие фильтра оценивается как истинное, значение передается сборщику. Наконец, сборщики определяют, как значения должны быть объединены и преобразованы.
Вот базовый конвейер, показывающий, что значение создается генератором, фильтруется фильтром и, в конечном итоге, собирается сборщиком.
Вот простой пример для понимания, который фильтрует список чисел, чтобы включить только четные числа:
В этом примере генератор имеет значение n <- numbers
, что указывает на то, что for comprehension будет выполнять итерацию по списку чисел. фильтр — n rem 2 == 0
, который указывает, что анализ будет включать только элементы n
, для которых остаток при делении n
на 2 равен 0. Ключевое слово do:
указывает преобразование, которое следует применить к каждому элементу. который удовлетворяет фильтру. В данном случае преобразование является тождественной функцией, поэтому элемент возвращается без изменений.
Также можно указать несколько генераторов в одном для понимания. В этом случае понимание будет перебирать декартово произведение генераторов. В следующем примере мы используем два генератора:
Фильтры также можно указать для каждого генератора. Например:
Помимо фильтрации и преобразования элементов, for comprehensions также можно использовать для выполнения побочных эффектов. Например, следующий фрагмент кода напечатает каждый элемент списка чисел:
Также возможно привязать результат для понимания к переменной, используя ключевое слово into
. Например:
Передача uniq: true
может гарантировать, что результаты будут добавлены в коллекцию только в том случае, если они не были возвращены ранее. Вот пример ключевого слова uniq:
Вместо этого параметр :reduce
позволяет нам реализовать шаг уменьшения. Требуется аккумулятор и блок do
, который использует предложения ->
:
Когда задано ключевое слово :reduce
, его значение используется в качестве начального аккумулятора, а блок do
должен быть изменен для использования предложений ->
, где левая часть ->
получает накопленное значение предыдущей итерации, а выражение в правой части должно возвращать значение. новое значение аккумулятора. Когда элементов больше нет, возвращается окончательное накопленное значение. Если элементов вообще нет, возвращается начальное значение аккумулятора.
В заключение отметим, что включения — это удобный и выразительный способ перебирать и преобразовывать наборы данных в Эликсире. Их можно использовать в качестве альтернативы рекурсивным функциям или вложенным функциям Enum, и они предлагают четкий и лаконичный синтаксис для указания сложных итераций и условной логики.