Enumモジュール
データを処理するにあたり,頻繁に利用することになるであろうEnumモジュールを紹介する.細かい情報については公式ドキュメントを読めば良いので,ここでは特によく利用するであろう関数のみ紹介する.
Enum.map/2
リストの要素に対して順番に同じ処理を行う場合に利用する.第1引数にEnumerable(列挙可能なデータ),第2引数に引数を処理する関数を与える.以下はそれぞれの要素を2倍したリストを返します.
iex> Enum.map([1, 2, 3, 4, 5], &(&1 * 2))
[2, 4, 6, 8, 10]
オブジェクト指向な言語に慣れた人には,このような繰り返しの処理の場合にはwhile
文を用いるのではないか?と思うかも知れません.しかしElixirにはwhile
文はなく,一般的にこのEnumモジュールの関数を用いて行います.Elixirにwhile
文がないことは,Elixirが関数型言語である事に由来しますが,脱線してしまうので詳しくは触れません.
Enum.reduce/3
リストの要素それぞれに何かしらの処理をして一つの値へ畳み込みを行う場合に利用します.第1引数にEnumerable,第2引数に初期値,第3引数に処理をする関数を与えます.以下はそれぞれの要素を足し合わせた値を返します.
iex> Enum.reduce([1, 2, 3, 4, 5], 0, fn (x, acc) -> x + acc end)
15
この例におけるx
はEnumerableの要素,acc
はそこまで畳み込んだ結果が与えられます.
コラム
Elixirでは+
演算子も関数の一つです.なので,上記の例は以下のように書き換えることも出来ます.
iex> Enum.reduce([1, 2, 3, 4, 5], 0, &+/2)
複雑に見えますが,これは+
と言う名前の関数をEnum.reduce/3
に与えているに過ぎません.
練習問題
以下のリスト(prime_ministers)を,
Enum
モジュールを使ってフルネームのリストに変換しましょう.例えば,[%{first: "太郎", last: "田中"}]
であれば,["田中太郎"]
が得られれば正解です.iex(1)> prime_ministers = [ ...(1)> %{first: "博文", last: "伊藤"}, ...(1)> %{first: "清隆", last: "黒田"}, ...(1)> %{first: "實美", last: "三條"}, ...(1)> %{first: "有朋", last: "山縣"}, ...(1)> %{first: "正義", last: "松方"} ...(1)> ] iex(2)> Enum.map(???) # ???を補完してみましょう ["伊藤博文", "黒田清隆", "三條實美", "山縣有朋", "松方正義"]
以下をコピーして使ってください
[ %{first: "博文", last: "伊藤"}, %{first: "清隆", last: "黒田"}, %{first: "實美", last: "三條"}, %{first: "有朋", last: "山縣"}, %{first: "正義", last: "松方"} ]
1で作ったリストを,歴代総理大臣の変遷がわかる文字列に変換してみましょう.
iex(3)> [head | tail] = ["伊藤博文", "黒田清隆", "三條實美", "山縣有朋", "松方正義"] # 前処理 iex(4)> Enum.reduce(???) # ???を補完してみましょう "伊藤博文 -> 黒田清隆 -> 三條實美 -> 山縣有朋 -> 松方正義"