コレクション
リスト
[] で囲むとリストになる
["a", "b", "c"]
リストには異なる型を入れることができる
list = [3.14, :pie, "Apple"]
Enum.at で特定の要素を指定できる
Enum.at(list, 1)
list[index] のような指定はできない
list[1]
Elixir ではリスト内の一部の値を変更する、ということはできない
(値の再代入=再束縛はできないため)
そのため、値を置き換えたリストを再定義する
各要素をパターンマッチングし、一致した場合のみ値を入れ替える
list
|> Enum.map(fn
"Apple" -> :orange
other -> other
end)
インデックス付きにした上で、インデックスのパターンマッチングで値を入れ替える
list
|> Enum.with_index()
|> Enum.map(fn
{_, 1} -> "π"
{other, _} -> other
end)
リストへの追加
先頭への追加は [<追加する値>|<追加されるリスト>] で記述でき、高速に動作する
["π" | list]
末尾への追加は [<追加されるリスト>|<追加する値>] で記述できない
[list | "π"]
末尾への追加は ++ でリストを結合する
list ++ ["π"]
[1, 2] ++ [3, 4, 1]
リストの差分
A -- B で A に存在して B に存在しない要素を取得できる
["a", "b", "c", "d"] -- ["a", "c", "e"]
リストの先頭
hd 関数でリストの先頭が取得できる
hd(["a", "b", "c", "d"])
リストの尾部(先頭以外)
tl 関数でリストの尾部(先頭以外)が取得できる
末尾ではないので注意
tl(["a", "b", "c", "d"])
リストの先頭と尾部
先頭と尾部をまとめて取得することもできる
[list_head | list_tail] = ["a", "b", "c", "d"]
list_head
list_tail
タプル
{} で囲むとタプルになる
{"a", "b", "c"}
タプルには異なる型を入れることができる
tapple = {3.14, :pie, "Apple"}
elem(<タプル>,<インデックス>) で特定の要素を取得する
elem(tapple, 1)
キーワードリスト
キーと値をリストに列挙する
キーは必ず atom 型
kl = [
foo: "bar",
hello: "world"
]
<キーワードリスト>[<キー>] で特定の要素を取得する
kl[:hello]
キーは重複できる
duplicated_kl = [
foo: "foo",
foo: "bar",
foo: "baz"
]
重複している場合、取得時には先頭が優先される
duplicated_kl[:foo]
マップ
キーの型に制約がない
map = %{
:foo => "bar",
"hello" => :world
}
<マップ>[<キー>] で特定の要素を取得する
map["hello"]
キーは重複できない
末尾の値が優先される
duplicated_map = %{
:foo => "foo",
:foo => "bar",
:foo => "baz"
}
atom だけがキーの場合、簡略的な書き方もできる
map = %{
foo: "bar",
hello: "world"
}
map.foo
キーを指定しての値の入れ替えが簡単に記述できる
%{map | foo: "baz"}
新しいキーを追加する場合は Map.put を使用する
Map.put(map, :new, "123")