«نقشه» یک ساختار داده است که جفتهای کلید-مقدار را نگه میدارد.
کلیدها میتوانند از هر نوعی باشند، اما باید یکتا باشند.
مقدارها میتوانند از هر نوعی باشند و لازم نیست یکتا باشند.
نقشه ترتیب محتویات خود را تضمین نمیکند، هرچند چنین به نظر میرسد.
نقشه را میتوان با شکل نوشتاری تعریف کرد:
# An empty map
%{}
# A map with the atom key :a associated to the integer value 1
%{a: 1}
# A map with the string key "a" associated to the float value 2.0
%{"a" => 2.0}
# A map with the map key %{} with the list value [1 ,2, 3]
%{%{} => [1, 2, 3]}
# A map with keys of different types
%{:a => 1, "b" => 2}
نقشه را میتوان با استفاده از Map.new از ماژول Map نیز نمونهسازی کرد. این کار ممکن است زمانی استفاده شود که از قبل یک مجموعهی قابل شمارش دارید که میخواهید به لیست تبدیل کنید:
kw_list = [a: 1, b: 2]
Map.new(kw_list)
# => %{a: 1, b: 2}
به مقدارهای داخل یک نقشه میتوان به روشهای مختلفی دسترسی پیدا کرد:
my_map = %{key: "value"}
# with a dot if the key is an atom
my_map.key
# => "value"
# with [], a syntax provided by the Access behaviour
my_map[:key]
# => "value"
# with pattern matching
%{key: x} = my_map
x
# => "value"
# with Map.get/2
Map.get(my_map, :key)
# => "value"
ماژول Map که همراه کتابخانهی استاندارد ارائه میشود، توابع مفید زیادی برای استفاده از نقشه دارد.
Map.delete(%{a: 2, b: 3}, :a)
# => %{b: 3}
نقشه پروتکل Enumerable را پیادهسازی میکند و امکان استفاده از توابع ماژول Enum را فراهم میکند.
توابع بینام یا ارجاعهای تابع گرفتهشده اغلب به عنوان آرگومان برای توابع Map و ماژول Enum لازم هستند
# Increment the value by one, if it is not found, update it with 0
Map.update(%{a: 1}, :a, 0, &(&1 + 1))
# => %{a: 2}
# Sorting by a specific sub-value
list = [{"A", 4}, {"B", 3}, {"C", 2}, {"D", 1}]
Enum.sort_by(list, &Kernel.elem(&1, 1))
# => [{"D", 1}, {"C", 2}, {"B", 3}, {"A", 4}]