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(%{})