Enum وحدة مفيدة جدًا توفّر مجموعة من الخوارزميات للتعامل مع القوابل للتعداد. فهي توفّر:
sort/2، sort_by/2)،filter/2)،group_by/3)،count/2)find/3)،min/3، max/3)،reduce/3، reduce_while/3)،والمزيد غير ذلك! راجع توثيق وحدة 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(%{})