Сопоставление с образцом — это техника, которую Эликсир наследует от Эрланга. Это очень мощный метод, который позволяет нам извлекать более простые подструктуры из сложных структур данных, таких как списки, кортежи, карты и т. Д.
Матч состоит из двух основных частей: левой и правой . Правая сторона — это структура данных любого типа. Левая сторона пытается сопоставить структуру данных с правой стороны и связать любые переменные слева с соответствующей подструктурой справа. Если совпадение не найдено, оператор выдает ошибку.
Самое простое совпадение — это одиночная переменная слева и любая структура данных справа. Эта переменная будет соответствовать чему угодно . Например,
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)
Это сохранит значения {«Первая переменная»} в var_1 и «Вторая переменная» в var_2 . Существует также специальная переменная _ (или переменные с префиксом ‘_’), которая работает точно так же, как и другие переменные, но говорит elixir: «Убедитесь, что что-то здесь, но мне все равно, что это такое». , В предыдущем примере _unused_var была одной из таких переменных.
Мы можем сопоставить более сложные образцы, используя эту технику. Например, если вы хотите развернуть и получить номер в кортеже, который находится внутри списка, который сам находится в списке, вы можете использовать следующую команду —
[_, [_, {a}]] = ["Random string", [:an_atom, {24}]] IO.puts(a)
Вышеуказанная программа генерирует следующий результат —
24
Это свяжет a с 24. Другие значения игнорируются, так как мы используем ‘_’.
В сопоставлении с образцом, если мы используем переменную справа , используется ее значение. Если вы хотите использовать значение переменной слева, вам нужно использовать оператор pin.
Например, если у вас есть переменная «a», имеющая значение 25, и вы хотите сопоставить ее с другой переменной «b», имеющей значение 25, то вам нужно ввести —
a = 25 b = 25 ^a = b
Последняя строка соответствует текущему значению a , а не присваивает его значению b . Если у нас есть несоответствующий набор левой и правой стороны, оператор соответствия вызывает ошибку. Например, если мы попытаемся сопоставить кортеж со списком или список размером 2 со списком размера 3, появится сообщение об ошибке.