Elixir-maps
Elixir-マップ
キーワードリストは、リストに保存されているコンテンツをキーでアドレス指定する便利な方法ですが、その下では、Elixirはまだリストを調べています。 リストをすべて調べる必要がある他の計画がある場合は適切かもしれませんが、データへの唯一のアプローチとしてキーを使用する予定の場合は不必要なオーバーヘッドになる可能性があります。
これは、地図があなたを救う場所です。 キーと値のストアが必要なときはいつでも、マップは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}
https://elixir-lang.org/docs/stable/elixir/Mapl [マップモジュール]は、マップを操作するための便利な関数を備えたキーワードモジュールと非常によく似たAPIを提供します。 Map.get、Map.delete などの関数を使用して、マップを操作できます。
Atomキーを使用したマップ
マップにはいくつかの興味深いプロパティがあります。 マップ内のすべてのキーがアトムである場合、便宜上、キーワード構文を使用できます-
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
マップの別の興味深い特性は、原子キーを更新およびアクセスするための独自の構文を提供することです-
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
上記のプログラムは、次の結果を生成します-
1
この方法でアトムキーにアクセスするには、アトムキーが存在する必要があります。そうしないと、プログラムが動作しなくなります。