
- Elixir 教程
- Elixir - 首頁
- Elixir - 概述
- Elixir - 環境
- Elixir - 基本語法
- Elixir - 資料型別
- Elixir - 變數
- Elixir - 運算子
- Elixir - 模式匹配
- Elixir - 決策
- Elixir - 字串
- Elixir - 字元列表
- Elixir - 列表和元組
- Elixir - 關鍵字列表
- Elixir - Maps
- Elixir - 模組
- Elixir - 別名
- Elixir - 函式
- Elixir - 遞迴
- Elixir - 迴圈
- Elixir - 可列舉
- Elixir - 流
- Elixir - 結構體
- Elixir - 協議
- Elixir - 檔案 I/O
- Elixir - 程序
- Elixir - 符號
- Elixir - 推導式
- Elixir - 型別規範
- Elixir - 行為
- Elixir - 錯誤處理
- Elixir - 宏
- Elixir - 庫
- Elixir 有用資源
- Elixir - 快速指南
- Elixir - 有用資源
- Elixir - 討論
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
這將使 a 與 1 匹配。因此,它將生成輸出 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
請注意,要以這種方式訪問原子鍵,它必須存在,否則程式將無法工作。