39 lines
2.6 KiB
Markdown
39 lines
2.6 KiB
Markdown
---
|
||
title: Pattern Matching
|
||
localeTitle: Correspondência de Padrões
|
||
---
|
||
## Correspondência de Padrões
|
||
|
||
A correspondência de padrões é uma técnica que o Elixir herda da forma Erlang. É uma técnica muito poderosa que nos permite extrair subestruturas mais simples de estruturas de dados complicadas, como listas, tuplas, mapas, etc.
|
||
|
||
Um jogo tem duas partes principais, uma esquerda e uma direita. O lado direito é uma estrutura de dados de qualquer tipo. O lado esquerdo tenta combinar a estrutura de dados no 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 correspondência mais simples é uma variável solitária à esquerda e qualquer estrutura de dados à direita. Essa variável corresponderá a qualquer coisa. Por exemplo:
|
||
`x = 12`
|
||
`x = "Hello"`
|
||
`IO.puts(x)`
|
||
|
||
Você pode colocar variáveis dentro de uma estrutura para poder capturar uma subestrutura. Por exemplo:
|
||
`[var_1, _unused_var, var_2] = [{"First variable"}, 25, "Second variable" ]`
|
||
`IO.puts(var_1)`
|
||
`IO.puts(var_2)`
|
||
|
||
Isto irá armazenar os valores, `{"First variable"}` no var _1 e `"Second variable"` no var_ 2. Há também uma variável especial (ou variáveis prefixadas com '\_') que funciona exatamente como outras variáveis, mas diz elixir, "Certifique-se de que algo está aqui, mas não me importo com o que é". No exemplo anterior, \_unused\_var era uma dessas variáveis.
|
||
|
||
Podemos combinar padrões mais complicados usando essa técnica. Por exemplo, se você quiser desembrulhar e obter um número em uma tupla que esteja dentro de uma lista que esteja em uma lista, use o seguinte comando:
|
||
`[_, [_, {a}]] = ["Random string", [:an_atom, {24}]]`
|
||
`IO.puts(a)`
|
||
|
||
O programa acima gera o seguinte resultado -
|
||
`24`
|
||
|
||
Isto irá ligar um para 24. Outros valores são ignorados como estamos usando '\_'.
|
||
|
||
Na correspondência de padrões, se usarmos uma variável à direita, seu valor será usado. Se você quiser usar o valor de uma variável à esquerda, você precisará usar o operador pin.
|
||
|
||
Por exemplo, se você tem uma variável "a" com o valor 25 e você quer combiná-la com outra variável "b" com valor 25, então você precisa digitar -
|
||
`a = 25`
|
||
`b = 25`
|
||
`^a = b`
|
||
|
||
A última linha corresponde ao valor atual de um, 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 gera 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. |