この記事は、Elixir その2 Advent Calendar 2020 の5日目です。
前日は とあるサイトでのみ%HTTPoison.Error{id: nil, reason: :closed}が発生 (Elixir) でした。
はじめに
- Elixirで二次元のリストを操作するにはどうすればいいでしょうか
- 二次元リストと言っているのはこういうやつのことです
[
[1, 2, 3],
[4, 5, 6]
]
結論
たとえばlist_of_lists[1][2]
を読み取りたい
Enum.at/2を2回使う
iex> list_of_lists = [[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
iex> Enum.at(list_of_lists, 1) |> Enum.at(2)
6
get_inを使う
iex> list_of_lists = [[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
iex> get_in(list_of_lists, [Access.at(1), Access.at(2)])
6
- ちなみに三次元はこんな感じ
iex> get_in([[[1, 2, 3], [4, 5, 6]], []], [Access.at(0), Access.at(1), Access.at(2)])
6
たとえばlist_of_lists[1][2]
を書き換えたい
EnumモジュールやListモジュールを駆使して書き換える
iex> list_of_lists = [[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
iex> list = Enum.at(list_of_lists, 1) |> List.update_at(2, fn _ -> 8 end)
[4, 5, 8]
iex> List.update_at(list_of_lists, 1, fn _ -> list end)
[[1, 2, 3], [4, 5, 8]]
put_inを使う
iex> list_of_lists = [[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
iex> put_in(list_of_lists, [Access.at(1), Access.at(2)], 8)
[[1, 2, 3], [4, 5, 8]]
- ちなみに三次元はこんな感じ
iex> put_in([[[1, 2, 3], [4, 5, 6]], []], [Access.at(0), Access.at(1), Access.at(2)], 8)
[[[1, 2, 3], [4, 5, 8]], []]
Wrapping Up
- Enjoy Elixir !!!
- 私はDesigning Elixir Systems with OTPという本をきっかけに、get_in/2やput_in/3を知りました
- ただこの本は最初のほうだけ読んだだけで、残りは全然読めていない
- 読んでいきたい