Elixir語言中 Map
相關用法介紹如下。
Maps 是 Elixir 中的 "go to" 鍵值數據結構。
可以使用 %{}
語法創建映射,鍵值對可以表示為 key => value
:
iex> %{}
%{}
iex> %{"one" => :two, 3 => "four"}
%{3 => "four", "one" => :two}
映射中的鍵值對不遵循任何順序(這就是為什麽上麵示例中的打印映射與創建的映射具有不同順序的原因)。
Map 對鍵類型沒有任何限製:任何東西都可以是 Map 中的鍵。作為鍵值結構,映射不允許重複鍵。使用 exact-equality 運算符 (
) 比較 key 。如果在映射文字中定義了衝突鍵,則以最後一個為準。===/2
當鍵值對中的鍵是原子時,可以使用 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
與包含一組預定原子鍵的映射一起使用,這些原子鍵預計將始終存在。通過
定義的結構是這種 "static maps" 的一個示例,其中的鍵也可以在編譯時檢查。defstruct/1
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
,在線性時間內運行,因為它們需要到達Map中的每個元素。values/1
Map還實現了
協議,因此在Enumerable
模塊中可以找到許多與Map一起使用的函數。此外,在 Enum
中還可以找到以下Map函數:Kernel
相關用法
- Elixir Map.keys用法及代碼示例
- Elixir Map.values用法及代碼示例
- Elixir Map.update用法及代碼示例
- Elixir MapSet用法及代碼示例
- Elixir Map.split用法及代碼示例
- Elixir MapSet.intersection用法及代碼示例
- Elixir Map.put_new_lazy用法及代碼示例
- Elixir Map.drop用法及代碼示例
- Elixir Map.get用法及代碼示例
- Elixir MapSet.member?用法及代碼示例
- Elixir Map.new用法及代碼示例
- Elixir Map.take用法及代碼示例
- Elixir MapSet.size用法及代碼示例
- Elixir Map.get_and_update!用法及代碼示例
- Elixir Map.has_key?用法及代碼示例
- Elixir MapSet.equal?用法及代碼示例
- Elixir Map.replace用法及代碼示例
- Elixir Map.update!用法及代碼示例
- Elixir Map.from_struct用法及代碼示例
- Elixir Map.reject用法及代碼示例
- Elixir Map.delete用法及代碼示例
- Elixir Map.to_list用法及代碼示例
- Elixir MapSet.new用法及代碼示例
- Elixir Map.equal?用法及代碼示例
- Elixir Map.fetch!用法及代碼示例
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Map。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。