Enum ist ein sehr nützliches Modul, das eine Reihe von Algorithmen für die Arbeit mit Enumerables bereitstellt. Es bietet:
sort/2, sort_by/2),filter/2),group_by/3),count/2)find/3),min/3, max/3),reduce/3, reduce_while/3),Und vieles mehr! Eine vollständige Liste findest du in der Dokumentation des Enum-Moduls.
Im Allgemeinen ist ein Enumerable eine beliebige Datenstruktur, über die iteriert werden kann, also eine Sammlung. In Elixir ist ein Enumerable jeder Datentyp, der das Protokoll Enumerable implementiert. Das sind:
Mach dir keine Sorgen, wenn du noch nicht alle kennst.
Jeder kann das Enumerable-Protokoll für seine eigene Datenstruktur implementieren.
Mit Enum.reduce/2 kannst du das gesamte Enumerable zu einem einzelnen Wert reduzieren. Dazu wird eine spezielle Variable namens Akkumulator verwendet. Der Akkumulator trägt den Zwischenzustand der Reduktion zwischen den Iterationen. Damit ist sie eine der mächtigsten Funktionen für Enumerables. Viele andere spezialisierte Funktionen lassen sich durch das allgemeinere reduce ersetzen. Zum Beispiel ...
Den größten Wert finden:
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
Und sogar Mapping (allerdings muss das Ergebnis danach umgekehrt werden):
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]
Mit Map.new/2:
%{a: 1, b: 2}
|> Map.new(fn {key, value} -> {key, value * 10} end)
Mit Enum.into/3:
%{a: 1, b: 2}
|> Enum.into(%{}, fn {key, value} -> {key, value * 10} end)
Mit Enum.map/2:
%{a: 1, b: 2}
|> Enum.map(fn {key, value} -> {key, value * 10} end)
|> Enum.into(%{})