當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Map用法及代碼示例


Elixir語言中 Map 相關用法介紹如下。

Maps 是 Elixir 中的 "go to" 鍵值數據結構。

可以使用 %{} 語法創建映射,鍵值對可以表示為 key => value

iex> %{}
%{}
iex> %{"one" => :two, 3 => "four"}
%{3 => "four", "one" => :two}

映射中的鍵值對不遵循任何順序(這就是為什麽上麵示例中的打印映射與創建的映射具有不同順序的原因)。

Map 對鍵類型沒有任何限製:任何東西都可以是 Map 中的鍵。作為鍵值結構,映射不允許重複鍵。使用 exact-equality 運算符 ( ===/2 ) 比較 key 。如果在映射文字中定義了衝突鍵,則以最後一個為準。

當鍵值對中的鍵是原子時,可以使用 key: value 速記語法(與許多其他特殊形式一樣):

iex> %{a: 1, b: 2}
%{a: 1, b: 2}

如果您想將速記語法與 => 混合使用,則速記語法必須位於末尾:

iex> %{"hello" => "world", a: 1, b: 2}
%{:a => 1, :b => 2, "hello" => "world"}

Map中的鍵可以通過此模塊中的某些函數(例如 Map.get/3 Map.fetch/2 )或通過 Access 模塊提供的 map[] 語法訪問:

iex> map = %{a: 1, b: 2}
iex> Map.fetch(map, :a)
{:ok, 1}
iex> map[:b]
2
iex> map["non_existing_key"]
nil

要訪問原子鍵,也可以使用map.key 表示法。請注意,如果 map 不包含鍵 :key ,則 map.key 將引發 KeyError ,而 map[:key] 將返回 nil

map = %{foo: "bar", baz: "bong"}
map.foo
#=> "bar"
map.non_existing_key
** (KeyError) key :non_existing_key not found in: %{baz: "bong", foo: "bar"}

注意:訪問字段時不要添加括號,例如在 data.key() 中。如果使用括號,Elixir 將期望 data 是表示模塊的原子,並嘗試在其中調用 function key/0

訪問鍵的兩種語法揭示了映射的雙重性質。 map[key] 語法用於動態創建的可能具有任何類型的任何鍵的映射。 map.key 與包含一組預定原子鍵的映射一起使用,這些原子鍵預計將始終存在。通過 defstruct/1 定義的結構是這種 "static maps" 的一個示例,其中的鍵也可以在編譯時檢查。

Map可以進行模式匹配。當映射位於模式匹配的左側時,如果右側的映射包含左側的鍵並且它們的值與左側的值匹配,它將匹配。這意味著空Map匹配每張Map。

iex> %{} = %{foo: "bar"}
%{foo: "bar"}
iex> %{a: a} = %{:a => 1, "b" => 2, [:c, :e, :e] => 3}
iex> a
1

但這會引發 MatchError 異常:

%{:c => 3} = %{:a => 1, 2 => :b}

在編寫映射文字以及匹配時,變量都可以用作映射鍵:

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

Maps 還支持特定的更新語法來更新存儲在 existing 原子鍵下的值:

iex> map = %{one: 1, two: 2}
iex> %{map | one: "one"}
%{one: "one", two: 2}

當映射中不存在的鍵被更新時,將引發 KeyError 異常:

%{map | three: 3}

該模塊中需要查找特定鍵的函數在對數時間內工作。這意味著查找鍵所需的時間隨著Map的增長而增長,但它與Map大小不成正比。與在列表中查找元素相比,它的性能更好,因為列表具有線性時間複雜度。一些函數,例如 keys/1 values/1 ,在線性時間內運行,因為它們需要到達Map中的每個元素。

Map還實現了 Enumerable 協議,因此在 Enum 模塊中可以找到許多與Map一起使用的函數。此外,在 Kernel 中還可以找到以下Map函數:

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Map。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。