Elixir - Khớp mẫu

Đối sánh mẫu là một kỹ thuật mà Elixir kế thừa mẫu Erlang. Đây là một kỹ thuật rất mạnh mẽ cho phép chúng ta trích xuất các cấu trúc con đơn giản hơn từ các cấu trúc dữ liệu phức tạp như danh sách, bộ dữ liệu, bản đồ, v.v.

Một trận đấu có 2 phần chính, left và một rightbên. Phía bên phải là cấu trúc dữ liệu thuộc bất kỳ loại nào. Phía bên trái cố gắng khớp cấu trúc dữ liệu ở phía bên phải và liên kết bất kỳ biến nào ở bên trái với cấu trúc con tương ứng ở bên phải. Nếu không tìm thấy kết quả phù hợp, nhà điều hành sẽ đưa ra lỗi.

Đối sánh đơn giản nhất là một biến duy nhất ở bên trái và bất kỳ cấu trúc dữ liệu nào ở bên phải. This variable will match anything. Ví dụ,

x = 12
x = "Hello"
IO.puts(x)

Bạn có thể đặt các biến bên trong một cấu trúc để bạn có thể nắm bắt một cấu trúc con. Ví dụ,

[var_1, _unused_var, var_2] = [{"First variable"}, 25, "Second variable" ]
IO.puts(var_1)
IO.puts(var_2)

Điều này sẽ lưu trữ các giá trị, {"First variable"}trong var_1"Second variable"trong var_2 . Ngoài ra còn có một_ biến (hoặc các biến có tiền tố là '_') hoạt động chính xác như các biến khác nhưng nói với elixir, "Make sure something is here, but I don't care exactly what it is.". Trong ví dụ trước, _unused_var là một trong những biến như vậy.

Chúng ta có thể ghép các mẫu phức tạp hơn bằng kỹ thuật này. Đối vớiexample nếu bạn muốn mở và lấy một số trong một bộ giá trị nằm trong danh sách mà bản thân nó nằm trong danh sách, bạn có thể sử dụng lệnh sau:

[_, [_, {a}]] = ["Random string", [:an_atom, {24}]]
IO.puts(a)

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

24

Điều này sẽ ràng buộc a đến 24. Các giá trị khác bị bỏ qua khi chúng ta đang sử dụng '_'.

Trong đối sánh mẫu, nếu chúng ta sử dụng một biến trên right, giá trị của nó được sử dụng. Nếu bạn muốn sử dụng giá trị của một biến ở bên trái, bạn sẽ cần sử dụng toán tử pin.

Ví dụ: nếu bạn có một biến "a" có giá trị 25 và bạn muốn so khớp nó với một biến khác "b" có giá trị 25, thì bạn cần nhập:

a = 25
b = 25
^a = b

Dòng cuối cùng khớp với giá trị hiện tại của a, thay vì gán nó, cho giá trị của b. Nếu chúng ta có tập hợp bên trái và bên phải không khớp nhau, người điều khiển đối sánh sẽ mắc lỗi. Ví dụ: nếu chúng tôi cố gắng khớp một bộ tuple với một danh sách hoặc một danh sách có kích thước 2 với danh sách có kích thước 3, một lỗi sẽ được hiển thị.