Elixir - Maps



關鍵字列表是一種透過鍵訪問儲存在列表中的內容的便捷方法,但在底層,Elixir 仍然需要遍歷整個列表。如果您對該列表還有其他需要遍歷所有元素的計劃,這可能是合適的,但如果您計劃僅使用鍵作為訪問資料的方式,則這可能是不必要的開銷。

這就是 maps 能夠幫助您的地方。無論何時您需要鍵值儲存,maps 都是 Elixir 中的“首選”資料結構。

建立 Map

使用 %{} 語法建立 map:

map = %{:a => 1, 2 => :b}

與關鍵字列表相比,我們已經可以看到兩個區別:

  • Maps 允許任何值作為鍵。
  • Maps 的鍵不遵循任何順序。

訪問鍵

為了訪問與鍵關聯的值,Maps 使用與關鍵字列表相同的語法:

map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])

執行以上程式時,會生成以下結果:

1
b

插入鍵

要在 map 中插入鍵,我們使用 Dict.put_new 函式,該函式以 map、新鍵和新值作為引數:

map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value") 
IO.puts(new_map[:new_val])

這將在新的 map 中插入鍵值對 :new_val - "value"。執行以上程式時,會生成以下結果:

"value"

更新值

要更新 map 中已存在的值,可以使用以下語法:

map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])

執行以上程式時,會生成以下結果:

25

模式匹配

與關鍵字列表相比,maps 在模式匹配中非常有用。當 map 用於模式時,它將始終匹配給定值的子集:

%{:a => a} = %{:a => 1, 2 => :b}
IO.puts(a)

以上程式生成以下結果:

1

這將使 a1 匹配。因此,它將生成輸出 1

如上所示,只要模式中的鍵存在於給定的 map 中,map 就會匹配。因此,空 map 匹配所有 map。

在訪問、匹配和新增 map 鍵時可以使用變數:

n = 1
map = %{n => :one}
%{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}

Map 模組 提供了與 Keyword 模組非常相似的 API,以及用於操作 map 的便捷函式。您可以使用諸如 Map.get, Map.delete 之類的函式來操作 map。

帶有原子鍵的 Maps

Maps 有一些有趣的特性。當 map 中的所有鍵都是原子時,您可以使用關鍵字語法以獲得便利:

map = %{:a => 1, 2 => :b} 
IO.puts(map.a) 

maps 的另一個有趣的特性是它們提供了自己的語法來更新和訪問原子鍵:

map = %{:a => 1, 2 => :b}
IO.puts(map.a)

以上程式生成以下結果:

1

請注意,要以這種方式訪問原子鍵,它必須存在,否則程式將無法工作。

廣告