Эликсир - сопоставление с образцом

Сопоставление с образцом - это метод, который Elixir наследует от Erlang. Это очень мощный метод, который позволяет нам извлекать более простые подструктуры из сложных структур данных, таких как списки, кортежи, карты и т. Д.

Матч состоит из двух основных частей: left и rightбоковая сторона. Правая сторона - это структура данных любого типа. Левая сторона пытается сопоставить структуру данных с правой стороны и связать любые переменные слева с соответствующей подструктурой справа. Если совпадение не найдено, оператор выдает ошибку.

Самое простое совпадение - это одиночная переменная слева и любая структура данных справа. This variable will match anything. Например,

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

Вы можете разместить переменные внутри структуры, чтобы вы могли захватить подструктуру. Например,

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

Это сохранит значения, {"First variable"}в var_1 и"Second variable"в var_2 . Также есть специальный_ переменная (или переменные с префиксом '_'), которая работает точно так же, как другие переменные, но сообщает elixir, "Make sure something is here, but I don't care exactly what it is.". В предыдущем примере _unused_var была одной из таких переменных.

Используя эту технику, мы можем сопоставить более сложные шаблоны. Заexample если вы хотите развернуть и получить число в кортеже, который находится внутри списка, который сам находится в списке, вы можете использовать следующую команду -

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

Вышеупомянутая программа генерирует следующий результат -

24

Это свяжет a до 24. Остальные значения игнорируются, поскольку мы используем '_'.

При сопоставлении с образцом, если мы используем переменную в right, используется его значение. Если вы хотите использовать значение переменной слева, вам нужно использовать оператор pin.

Например, если у вас есть переменная «a», имеющая значение 25, и вы хотите сопоставить ее с другой переменной «b», имеющей значение 25, вам необходимо ввести -

a = 25
b = 25
^a = b

Последняя строка соответствует текущему значению aвместо того, чтобы присваивать его значению b. Если у нас есть несовпадающий набор левой и правой стороны, оператор сопоставления вызывает ошибку. Например, если мы попытаемся сопоставить кортеж со списком или список размера 2 со списком размера 3, отобразится ошибка.