для понимания — это мощная языковая конструкция в 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, и они предлагают четкий и лаконичный синтаксис для указания сложных итераций и условной логики.