En

Enum の Elixir

98個の演習

Enumについて

Enumは、列挙可能なデータを扱うためのアルゴリズムを集めた、とても便利なモジュールです。次のようなものがあります。

ほかにもたくさんあります! すべての一覧はEnumモジュールのドキュメントを参照してください。

列挙可能

一般に、_列挙可能_とは、繰り返し処理できるデータ、つまりコレクションのことです。Elixirでは、列挙可能とは、Enumerableプロトコルを実装したデータ型のことです。具体的には、次のとおりです。

まだすべてを知らなくても心配いりません。

自分で作ったデータ構造にEnumerableプロトコルを実装することもできます。

Reduce

Enum.reduce/2を使うと、列挙可能なデータ全体を1つの値に_畳み込む_ことができます。そのために、_アキュムレーター_と呼ばれる特別な変数を使います。アキュムレーターは、繰り返しの間で畳み込みの中間状態を保持します。このことから、列挙可能なデータを扱ううえで最も強力な関数の1つになっています。ほかの多くの専門的な関数も、より汎用的な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(%{})
    
GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

Enumを学習する

練習はロックされています

Enumを練習するには、あと10個の演習のロックを解除してください