Enum은 enumerable을 다루기 위한 다양한 알고리즘을 제공하는 아주 유용한 모듈이에요. 다음과 같은 기능을 제공해요.
sort/2, sort_by/2),filter/2),group_by/3),count/2)find/3),min/3, max/3),reduce/3, reduce_while/3),그리고 훨씬 더 많아요! 전체 목록은 Enum 모듈 문서를 참고해요.
일반적으로 _enumerable_은 반복할 수 있는 모든 데이터, 즉 컬렉션이에요. Elixir에서 enumerable은 Enumerable 프로토콜을 구현한 모든 데이터 타입이에요. 다음과 같아요.
아직 이걸 다 몰라도 걱정하지 마세요.
누구나 자신만의 데이터 구조에 Enumerable 프로토콜을 구현할 수 있어요.
Enum.reduce/2를 사용하면 enumerable 전체를 하나의 값으로 _리듀스_할 수 있어요. 그러려면 _누산기_라는 특별한 변수를 사용해요. 누산기는 각 반복 사이의 리듀스 중간 상태를 담고 있어요. 덕분에 enumerable을 다루는 가장 강력한 함수 중 하나예요. 다른 많은 특수한 함수들은 더 일반적인 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(%{})