ここまでのあらまし
Elixir~Enumまつり1回目~Enum.chunk_every、Enum.all?、Enum.any?、Enum.at~
からはじめたように、Elixir公式ドキュメント のEnumを総ざらいして、理解を深めていくことにします。
"Elixirでシンセサイザーをつくる"というわたしの中長期的目標のため、音楽的なメタファーが思いつくものは解説に付与します。
法則性がわからない関数に関してはその旨を記載します。
おおむね一週間弱ですべてのEnum関数を洗うのが目標です。
Enum.at
Enum.at([2, 4, 6], 0)
2
Enum.at([2, 4, 6], 2)
6
Enum.at([2, 4, 6], 4)
nil
どうやらこれは、ゼロを起点にして(not1)、リストのn番目の値を返してくれる関数のようです。
Enum.chunk_every
Enum.chunk_every([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]
Enum.chunk_every([1, 2, 3, 4, 5, 6], 3, 2, :discard)
[[1, 2, 3], [3, 4, 5]]
Enum.chunk_every([1, 2, 3, 4, 5, 6], 3, 2, [7])
[[1, 2, 3], [3, 4, 5], [5, 6, 7]]
Enum.chunk_every([1, 2, 3, 4], 3, 3, [])
[[1, 2, 3], [4]]
Enum.chunk_every([1, 2, 3, 4], 10)
[[1, 2, 3, 4]]
Enum.chunk_every([1, 2, 3, 4, 5], 2, 3, [])
[[1, 2], [4, 5]]
一番上に関しては、リスト内の数字を2つごとに分けて出力しているように思います。
その下になっていくと法則性が徐々に分からなくなっていきます。
Enum.chunk_while
chunk_fun = fn item, acc ->
...> if rem(item, 2) == 0 do
...> {:cont, Enum.reverse([item | acc]), []}
...> else
...> {:cont, [item | acc]}
...> end
...> end
iex> after_fun = fn
...> [] -> {:cont, []}
...> acc -> {:cont, Enum.reverse(acc), []}
...> end
iex> Enum.chunk_while(1..10, [], chunk_fun, after_fun)
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
全く分かりません。飛ばします。
Enum.concat
Enum.concat([1..3,4..6,7..9])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Enum.concat([[1, [2], 3], [4], [5, 6]])
[1, [2], 3, 4, 5, 6]
Enum.concat([[1, [2], 3],[ [4], [5, 6]]])
[1, [2], 3, [4], [5, 6]]
Enum.concat(1..3, 4..6)
[1, 2, 3, 4, 5, 6]
Enum.concat([1, 2, 3], [4, 5, 6])
[1, 2, 3, 4, 5, 6]
リストのなかの数字を連番で出力、特別ひとつだけ[]で囲ってある要素だけ[]で囲って出力しているように思います。
Enum.count
Enum.count([1, 2, 3])
3
これは簡単なようです。リストの中にある要素の数をあわせて出力しているようです。
Enum.count([1, 2, 3, 4, 5], fn x -> rem(x, 2) == 0 end)
2
これは割ったらあまりがゼロになる要素の数として2を返しているようです。
(最初わからなかった...)
Enum.dedup
Enum.dedup([1, 2, 3, 3, 2, 1])
[1, 2, 3, 2, 1]
Enum.dedup([1, 1, 2, 2.0, :three, :three])
[1, 2, 2.0, :three]
リストの要素のなかで、重複するものを削って出力しているようです。
dedup_by
Enum.dedup_by([{1, :a}, {2, :b}, {2, :c}, {1, :a}], fn {x, _} -> x end)
[{1, :a}, {2, :b}, {1, :a}]
iex> Enum.dedup_by([5, 1, 2, 3, 2, 1], fn x -> x > 2 end)
[5, 1, 3, 2]
これもわかるようで法則性がわかりません...。
ここまで
きょうはここまで!
いままで派手で注目に値する関数ばかり記事にしていたので、なかなか音楽的なメタファー(これは先生からの指令です)を入れ込むことが難しいですね、、
うまずたゆまず、頑張ります。
Kento Mizuno