Elixir - Bản đồ

Danh sách từ khóa là một cách thuận tiện để giải quyết nội dung được lưu trữ trong danh sách theo khóa, nhưng bên dưới, Elixir vẫn đang xem qua danh sách. Điều đó có thể phù hợp nếu bạn có các kế hoạch khác cho danh sách đó yêu cầu xem qua tất cả danh sách đó, nhưng nó có thể là một chi phí không cần thiết nếu bạn định sử dụng khóa làm cách tiếp cận dữ liệu duy nhất của mình.

Đây là nơi bản đồ đến để giải cứu bạn. Bất cứ khi nào bạn cần lưu trữ khóa-giá trị, bản đồ là cấu trúc dữ liệu “đi đến” trong Elixir.

Tạo bản đồ

Bản đồ được tạo bằng cú pháp% {} -

map = %{:a => 1, 2 => :b}

So với danh sách từ khóa, chúng ta có thể thấy hai điểm khác biệt -

  • Bản đồ cho phép bất kỳ giá trị nào làm khóa.
  • Các phím của bản đồ không tuân theo bất kỳ thứ tự nào.

Truy cập một khóa

Để tích lũy giá trị được liên kết với một khóa, Maps sử dụng cú pháp tương tự như danh sách Từ khóa -

map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])

Khi chương trình trên được chạy, nó tạo ra kết quả sau:

1
b

Chèn khóa

Để chèn một khóa vào bản đồ, chúng tôi sử dụng Dict.put_new hàm lấy bản đồ, khóa mới và giá trị mới làm đối số -

map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value") 
IO.puts(new_map[:new_val])

Thao tác này sẽ chèn cặp khóa-giá trị :new_val - "value"trong một bản đồ mới. Khi chương trình trên được chạy, nó tạo ra kết quả sau:

"value"

Cập nhật giá trị

Để cập nhật một giá trị đã có trong bản đồ, bạn có thể sử dụng cú pháp sau:

map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])

Khi chương trình trên được chạy, nó tạo ra kết quả sau:

25

Khớp mẫu

Trái ngược với danh sách từ khóa, bản đồ rất hữu ích với đối sánh mẫu. Khi một bản đồ được sử dụng trong một mẫu, nó sẽ luôn khớp trên một tập hợp con của giá trị đã cho -

%{:a => a} = %{:a => 1, 2 => :b}
IO.puts(a)

Chương trình trên tạo ra kết quả sau:

1

Điều này sẽ phù hợp a với 1. Và do đó, nó sẽ tạo ra đầu ra là1.

Như được hiển thị ở trên, một bản đồ khớp với điều kiện là các phím trong mẫu tồn tại trong bản đồ nhất định. Do đó, một bản đồ trống phù hợp với tất cả các bản đồ.

Các biến có thể được sử dụng khi truy cập, khớp và thêm các khóa bản đồ -

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

Mô-đun Bản đồ cung cấp một API rất giống với mô-đun Từ khoá với các chức năng thuận tiện để thao tác với bản đồ. Bạn có thể sử dụng các chức năng nhưMap.get, Map.delete, để thao tác trên bản đồ.

Bản đồ có khóa Atom

Bản đồ đi kèm với một vài thuộc tính thú vị. Khi tất cả các khóa trong bản đồ là nguyên tử, bạn có thể sử dụng cú pháp từ khóa để thuận tiện -

map = %{:a => 1, 2 => :b} 
IO.puts(map.a)

Một tính chất thú vị khác của bản đồ là chúng cung cấp cú pháp riêng để cập nhật và truy cập các khóa nguyên tử -

map = %{:a => 1, 2 => :b}
IO.puts(map.a)

Chương trình trên tạo ra kết quả sau:

1

Lưu ý rằng để truy cập các khóa nguyên tử theo cách này, nó phải tồn tại hoặc chương trình sẽ không hoạt động.