Fork me on GitHub

Enum

Набор от алгоритми за изброяване върху колекции.

Съдържание

Enum

Enum модулът съдържа над сто функции за работа с колекции, за които учихме предният урок.

Този урок ще покрие само част от достъпните функции, за да видите пълния набор от функции, посетете официалните Enum документи; за lazy изброяване използвайте модула Stream.

all?

Когато използваме all?, и голяма част от Enum, ние предоставяме функция, която да бъде приложена върху елементите на колекцията ни. В случая с all?, функцията трябва да върне true за вески един елемент от колекцията, в противен случай връща false:

iex> Enum.all?(["foo", "bar", "hello"], fn(s) -> String.length(s) == 3 end)
false
iex> Enum.all?(["foo", "bar", "hello"], fn(s) -> String.length(s) > 1 end)
true

any?

За разлика от предходното, any? ще върне true ако поне един елемент е оценен като true:

iex> Enum.any?(["foo", "bar", "hello"], fn(s) -> String.length(s) == 5 end)
true

chunk

Ако се нуждаете да разбиете колекцията си на по-малки групи, то chunk е функцията, която най-вероятно търсите:

iex> Enum.chunk([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]

Съществуват няколко опции за chunk, но няма да навлизаме в тях, вижте chunk/2 в официалните документи, за да научите повече.

chunk_by

Ако се нуждаете да групирате колекцията си на базата на нещо друго освен размер може да използвате метода chunk_by. Той приема подаден обходим елемент и функция и когато върната стойност от тази фунцкия се промени, започва нова група:

iex> Enum.chunk_by(["one", "two", "three", "four", "five"], fn(x) -> String.length(x) end)
[["one", "two"], ["three"], ["four", "five"]]
iex> Enum.chunk_by(["one", "two", "three", "four", "five", "six"], fn(x) -> String.length(x) end)
[["one", "two"], ["three"], ["four", "five"], ["six"]]

each

Може да е нужно да итерирате през колекция, без да издавате нова стойност, като в този случй се използва each:

iex> Enum.each(["one", "two", "three"], fn(s) -> IO.puts(s) end)
one
two
three

Забележка: Методът each връща атома :ok.

map

За да приложим нашата функция върху всеки елемент и получим нова колекция, прегледайте функцията map:

iex> Enum.map([0, 1, 2, 3], fn(x) -> x - 1 end)
[-1, 0, 1, 2]

min

Намери минималната(min) стойност в нашата колекцията:

iex> Enum.min([5, 3, 0, -1])
-1

max

Връща максималната(max) стойност в колекцията:

iex> Enum.max([5, 3, 0, -1])
5

reduce

Чрез reduce може да редуцираме колекцията си до една единствена стойност. За да направим това подаваме опционален акумулатор (10 в този пример), който да бъде подаден в нашата функция; ако няма подаден акумулатор се използва първата стойност:

iex> Enum.reduce([1, 2, 3], 10, fn(x, acc) -> x + acc end)
16
iex> Enum.reduce([1, 2, 3], fn(x, acc) -> x + acc end)
6
iex> Enum.reduce(["a","b","c"], "1", fn(x,acc)-> x <> acc end)
"cba1"

sort

Да сортираме нашите колекции е улеснено не чрез една, а две sort функции. Първата достъпна за нас използва подредбата на термини на Elixir, за да установи сортираният ред:

iex> Enum.sort([5, 6, 1, 3, -1, 4])
[-1, 1, 3, 4, 5, 6]

iex> Enum.sort([:foo, "bar", Enum, -1, 4])
[-1, 4, Enum, :foo, "bar"]

Другата опция ни позволява да подадем сортираща функция:

# с нашата функция
iex> Enum.sort([%{:val => 4}, %{:val => 1}], fn(x, y) -> x[:val] > y[:val] end)
[%{val: 4}, %{val: 1}]

# без
iex> Enum.sort([%{:count => 4}, %{:count => 1}])
[%{count: 1}, %{count: 4}]

uniq

Може да ползваме uniq, за да премахнем повтарящите се елементи от нашите колекции:

iex> Enum.uniq([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
[1, 2, 3, 4]

Споделете тази страница