Elixir - correspondência de padrões

A correspondência de padrões é uma técnica que Elixir herda de Erlang. É uma técnica muito poderosa que nos permite extrair subestruturas mais simples de estruturas de dados complicadas como listas, tuplas, mapas, etc.

Uma partida tem 2 partes principais, uma left e um rightlado. O lado direito é uma estrutura de dados de qualquer tipo. O lado esquerdo tenta combinar a estrutura de dados do lado direito e vincular quaisquer variáveis ​​à esquerda à respectiva subestrutura à direita. Se uma correspondência não for encontrada, o operador gerará um erro.

A combinação mais simples é uma variável isolada à esquerda e qualquer estrutura de dados à direita. This variable will match anything. Por exemplo,

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

Você pode colocar variáveis ​​dentro de uma estrutura para que possa capturar uma subestrutura. Por exemplo,

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

Isso armazenará os valores, {"First variable"}em var_1 e"Second variable"em var_2 . Há também um especial_ variável (ou variáveis ​​prefixadas com '_') que funciona exatamente como outras variáveis, mas informa ao elixir, "Make sure something is here, but I don't care exactly what it is.". No exemplo anterior, _unused_var era uma dessas variáveis.

Podemos combinar padrões mais complicados usando esta técnica. Paraexample se você quiser desembrulhar e obter um número em uma tupla que está dentro de uma lista que está em uma lista, você pode usar o seguinte comando -

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

O programa acima gera o seguinte resultado -

24

Isso vai ligar a a 24. Outros valores são ignorados, pois estamos usando '_'.

Na correspondência de padrões, se usarmos uma variável no right, seu valor é usado. Se você quiser usar o valor de uma variável à esquerda, precisará usar o operador pin.

Por exemplo, se você tem uma variável "a" com valor 25 e deseja combiná-la com outra variável "b" com valor 25, você precisa inserir -

a = 25
b = 25
^a = b

A última linha corresponde ao valor atual de a, em vez de atribuí-lo, ao valor de b. Se tivermos um conjunto não correspondente do lado esquerdo e direito, o operador de correspondência gerará um erro. Por exemplo, se tentarmos combinar uma tupla com uma lista ou uma lista de tamanho 2 com uma lista de tamanho 3, um erro será exibido.