Elixir-マップ
キーワードリストは、リストに保存されているコンテンツをキーでアドレス指定するための便利な方法ですが、その下では、Elixirはまだリストをウォークスルーしています。そのリストにすべてをウォークスルーする必要がある他の計画がある場合は適切かもしれませんが、データへの唯一のアプローチとしてキーを使用することを計画している場合は、不要なオーバーヘッドになる可能性があります。
ここで地図が役に立ちます。Key-Valueストアが必要な場合は常に、マップはElixirの「移動先」データ構造です。
マップの作成
マップは%{}構文を使用して作成されます-
map = %{:a => 1, 2 => :b}
キーワードリストと比較すると、すでに2つの違いがわかります-
- マップでは、任意の値をキーとして使用できます。
- マップのキーはどの順序にも従いません。
キーへのアクセス
キーに関連付けられた値にアクセスするために、マップはキーワードリストと同じ構文を使用します-
map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])
上記のプログラムを実行すると、次の結果が生成されます-
1
b
キーの挿入
マップにキーを挿入するには、 Dict.put_new マップ、新しいキー、新しい値を引数として取る関数-
map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value")
IO.puts(new_map[:new_val])
これにより、キーと値のペアが挿入されます :new_val - "value"新しいマップで。上記のプログラムを実行すると、次の結果が生成されます-
"value"
値の更新
マップにすでに存在する値を更新するには、次の構文を使用できます-
map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])
上記のプログラムを実行すると、次の結果が生成されます-
25
パターンマッチング
キーワードリストとは対照的に、マップはパターンマッチングで非常に役立ちます。マップがパターンで使用される場合、マップは常に指定された値のサブセットに一致します-
%{:a => a} = %{:a => 1, 2 => :b}
IO.puts(a)
上記のプログラムは次の結果を生成します-
1
これは一致します a と 1。したがって、出力は次のように生成されます。1。
上に示したように、パターン内のキーが特定のマップに存在する限り、マップは一致します。したがって、空のマップはすべてのマップに一致します。
マップキーにアクセス、照合、追加するときに変数を使用できます-
n = 1
map = %{n => :one}
%{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}
Mapモジュールは、キーワードモジュールと非常によく似たAPIを提供し、マップを操作するための便利な関数を備えています。次のような機能を使用できますMap.get, Map.delete、マップを操作します。
Atomキーを使用したマップ
マップにはいくつかの興味深いプロパティがあります。マップ内のすべてのキーがアトムである場合、便宜上キーワード構文を使用できます-
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
マップのもう1つの興味深い特性は、アトムキーを更新およびアクセスするための独自の構文を提供することです。
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
上記のプログラムは次の結果を生成します-
1
この方法でアトムキーにアクセスするには、アトムキーが存在する必要があります。そうしないと、プログラムが機能しなくなります。