W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
當(dāng)你需要存儲鍵值對的時候,映射就是Elixir中最合適的數(shù)據(jù)結(jié)構(gòu)。使用%{}語法創(chuàng)建一個映射:
iex> map = %{:a => 1, 2 => :b}
%{2 => :b, :a => 1}
iex> map[:a]
1
iex> map[2]
:b
iex> map[:c]
nil
與關(guān)鍵詞列表相比較,我們能發(fā)現(xiàn)兩個不同點:
- 映射允許使用任何值作為鍵
- 映射的鍵是無序的
與關(guān)鍵詞列表相反,映射非常適合模式匹配。只需要左邊是右邊的子集就能夠匹配:
iex> %{} = %{:a => 1, 2 => :b}
%{2 => :b, :a => 1}
iex> %{:a => a} = %{:a => 1, 2 => :b}
%{2 => :b, :a => 1}
iex> a
1
iex> %{:c => c} = %{:a => 1, 2 => :b}
** (MatchError) no match of right hand side value: %{2 => :b, :a => 1}
如上所示,一個映射只需要它的鍵在給定的映射中存在就能匹配。因此,空映射匹配任何映射。
在訪問,匹配,添加映射鍵時可以使用變量:
iex> n = 1
1
iex> map = %{n => :one}
%{1 => :one}
iex> map[n]
:one
iex> %{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}
%{1 => :one, 2 => :two, 3 => :three}
Map
模塊提供了一個與Keyword
非常相似的API,包含了一系列方便操作映射的函數(shù):
iex> Map.get(%{:a => 1, 2 => :b}, :a)
1
iex> Map.to_list(%{:a => 1, 2 => :b})
[{2, :b}, {:a, 1}]
當(dāng)映射中所有鍵都是原子時,你可以簡寫成關(guān)鍵詞形式:
iex> map = %{a: 1, b: 2}
%{a: 1, b: 2}
另一個有趣的特性是,映射有著獨特的語法用于訪問和更新原子鍵:
iex> map = %{:a => 1, 2 => :b}
%{2 => :b, :a => 1}
iex> map.a
1
iex> map.c
** (KeyError) key :c not found in: %{2 => :b, :a => 1}
iex> %{map | :a => 2}
%{2 => :b, :a => 2}
iex> %{map | :c => 3}
** (KeyError) key :c not found in: %{2 => :b, :a => 1}
訪問和更新都要求所提供的鍵存在。例如,因為映射中不存在:c
鍵,所以訪問和更新:c
鍵失敗了。
Elixir開發(fā)者通常偏好使用map.field
格式以及模式匹配,而非Map
模塊中的函數(shù),因為前者具有一種目的明確的編程風(fēng)格。這篇文章提供了觀點和例子,關(guān)于如何在Elixir中通過編寫目的明確的代碼來獲得更簡潔快速的軟件。
最近映射已經(jīng)被引入了Erlang虛擬機(jī)中,而且從Elixir v1.2版本起它們開始能夠有效地支持?jǐn)?shù)以百萬的鍵。因此,如果你在使用之前的Elixir版本(V1.0或v1.1),并且想要支持至少幾百個鍵,那么你也許該考慮
HashDict
模塊。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: