En

Enum у Elixir

98 вправ

Про концепцію Enum

Enum - це дуже корисний модуль, який надає набір алгоритмів для роботи з перелічуваними даними. Він пропонує:

І це ще не все! Повний перелік шукайте в документації модуля Enum.

Перелічуване

Загалом перелічуване - це будь-які дані, які можна перебрати, тобто колекція. В Elixir перелічуване - це будь-який тип даних, який реалізує протокол Enumerable. Це:

Не варто хвилюватися, якщо ми ще не знаємо їх усіх.

Будь-хто може реалізувати протокол Enumerable для власної структури даних.

Згортання

Enum.reduce/2 дає змогу згорнути все перелічуване до одного значення. Для цього використовується спеціальна змінна, яку називають акумулятором. Акумулятор зберігає проміжний стан згортання між ітераціями. Саме тому це одна з найпотужніших функцій для перелічуваних даних. Багато інших спеціалізованих функцій можна замінити загальнішою reduce. Наприклад...

Пошук максимального значення:

Enum.max([4, 20, 31, 9, 2])
# => 31

Enum.reduce([4, 20, 31, 9, 2], nil, fn x, acc ->
  cond do
    acc == nil -> x
    x > acc -> x
    x <= acc -> acc
  end
end)

# => 31

І навіть перетворення (але після цього результат доведеться перевернути):

Enum.map([1, 2, 3, 4, 5], fn x -> x + 10 end)
# => [11, 12, 13, 14, 15]

Enum.reduce([1, 2, 3, 4, 5], [], fn x, acc -> [x + 10 | acc] end)
# => [15, 14, 13, 12, 11]

Перетворення словників

  • За допомогою Map.new/2:

    %{a: 1, b: 2}
    |> Map.new(fn {key, value} -> {key, value * 10} end)
    
  • За допомогою Enum.into/3:

    %{a: 1, b: 2}
    |> Enum.into(%{}, fn {key, value} -> {key, value * 10} end)
    
  • За допомогою Enum.map/2:

    %{a: 1, b: 2}
    |> Enum.map(fn {key, value} -> {key, value * 10} end)
    |> Enum.into(%{})
    
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Enum

Практика заблокована

Розблокуйте ще 10 вправ, щоб практикувати концепцію Enum