Powered by AppSignal & Oban Pro

コレクション

livebooks/02_Collection.livemd

コレクション

リスト

[] で囲むとリストになる

["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")