Рубрики
Без рубрики

Есть ли у Эликсира для петли?

После рассвета цивилизации человечество жаждало одну вещь – способность без усилий … Tagged with Elixir, функциональные, начинающие, Python.

Учитесь со мной эликсир! (4 серии деталей)

С момента рассвета цивилизации человечество жаждало одну вещь – способность без усилий повторять действие, пока не будет выполнено произвольное состояние.

Для цикла – это концепция программирования, которая бесконечно универсальна. Несмотря на то, что это не всегда лучший выбор в любой ситуации, может быть представлен случай в любой ситуации, когда программисту нужно что -то происходить более одного раза.

Таким образом, новый разработчик может быть удивлен, чтобы Google «имеет ли Эликсир для петли» и встречаться с ответом «Эликсир не имеет конструкций цикла, таких как петля или цикл, находящийся в курсе» ( Источник ).

Как бы вы написали код без петли?

В то время как рекурсия во многих языках программирования поставляется с бременем при высоком использовании памяти, Elixir использует Оптимизация хвостового вызова Для достижения аналогичных характеристик традиционных конструкций петли.

Несмотря на то, что вам было довольно просто писать собственную реализацию различных циклов, используя рекурсию, вам часто не нужно. Enum и Поток Модули предоставляют большую часть функциональности, которую вы обычно хотели бы от петли.

Основное различие между этими модулями заключается в том, что они с нетерпением загружены и загружены ленивыми, соответственно, что делает поток более хорошо подходящим для очень больших коллекций. А Ручей Модуль не будет подробно изучен в этом посте.

Вот несколько примеров общих операций, которые заменили бы какой -то код, где вы могли бы использовать для цикла:

карта

Карта применяет функцию к каждому элементу в списке и возвращает результаты в списке.

numbers = [1, 2, 3, 4]
squares = Enum.map(numbers, fn x -> x * x end)

Фильтр

Фильтр возвращает только элементы, которые приводят к Верно возвращается из данной функции.

numbers = [1, 2, 3, 4]
odds = Enum.filter(list, fn x -> rem(x, 2) == 1 end)

Находить

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

numbers = [1, 2, 3, 4]
first_even = Enum.find(list, fn x -> rem(x, 2) == 0 end)

Я скоро сделаю пост с более глубокими объяснениями различных операций массива, поэтому убедитесь, что Следуй за мной на разработке или же подписаться на мою рассылку Так что вы не пропустите это. Пока что посмотрим документация Для получения более подробной информации и других доступных функций.

Приведенные выше примеры показывают ситуации, когда вы можете заменить петлю на более конкретную реализацию, но Elixir также имеет конструкцию, которая еще ближе к цикле …

Понимание петли

Это немного синтаксического сахара, который позволяет вам делать такие вещи, как карта или фильтровать на перечисленном обработке, обрабатывая его как цикл.

Чтобы подготовить список числа в JavaScript, вы можете написать что -то подобное (я знаю, что есть функции, которые упростили бы это, но этот пример здесь, чтобы показать, как вы можете сделать это с помощью цикла):

let list = [1, 2, 3, 4, 5];
let squares = [];

for (let i = 0; i < list.length; i++) {
    squares.push(list[i] * list[i]);
}

В Эликсире, вот как такая же логика будет выглядеть как понимание:

list = [1, 2, 3, 4, 5]
squares = for n <- list, do: n * n

Эти понимания также имеют возможность пройти в фильтре. Если бы вы хотели сделать то же самое, что и выше, но только квадрат нечетные числа, это выглядело бы примерно так:

list = [1, 2, 3, 4, 5]
squares_of_odds = for n <- list, rem(n, 2) == 1, do: n * n

Эта конструкция должна выглядеть знакомо для разработчиков Python, которые писали такую же логику, как это:

list = [1, 2, 3, 4, 5]
squares = [x * x for x in list]

# you could also use the power operator and write it like this
squares = [x**2 for x in list]

# if you only wanted to square the odd numbers
squares_of_odds = [x**2 for x in [1, 2, 3, 4] if x % 2 == 1]

Дополнительные опции

Чтобы добавить немного больше гибкости, понимание цикла эликсира включает в себя : в и : уменьшить варианты, о которых вы можете узнать о Здесь Анкет

Итак, Эликсир имеет для петли?

Не совсем. Хотя понимание петли выглядит как петли, они на самом деле макросы, которые переписывают код в рекурсивные реализации. Кроме того, понимание цикла принимает перечисленные коллекции в качестве аргумента и в результате создает перечисляемую коллекцию. Петли, с другой стороны, будут продолжать выполняться до тех пор, пока любое произвольное условие верно.

дальнейшее чтение

Больше контента

Если вам это понравилось, вам также могут понравиться некоторые другие мои посты:

Учитесь со мной эликсир! (4 серии деталей)

Оригинал: “https://dev.to/brewinstallbuzzwords/does-elixir-have-for-loops-19p9”