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

これは一致します a1。したがって、出力は次のように生成されます。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

この方法でアトムキーにアクセスするには、アトムキーが存在する必要があります。そうしないと、プログラムが機能しなくなります。