DEV Community

Daniel Cunha
Daniel Cunha

Posted on

Elixir :: Pattern Matching

Uma das coisas que inicialmente me deram um nó ao estudar Elixir foi o operador =. Apesar de ser utilizado para atribuir valores a variáveis, esse operador no Elixir é chamado de match operator

Ao executar um trecho de código como este:

iex> x = 1
1
iex> 1 = x
1
iex> 2 = x
** (MatchError) no match of right hand side value: 1
Enter fullscreen mode Exit fullscreen mode

Podemos notar que a expressão 1 = x é uma expressão válida e isso é possível porque ambos os lados (direito e esquerdo) representam o mesmo valor, que no caso é 1. Entretando quando esses dois lados não dão match, um MatchError é retornado.

Só podemos atribuir valor para uma variável quando definida no lado esquerdo do operador =:

iex> x = 1
1
Enter fullscreen mode Exit fullscreen mode

Pattern Matching não funciona apenas para valores simples, você também pode utilizar para outros tipos, como:

iex> {a, b, c} = {:hello, "world", 42}
{:hello, "world", 42}
iex> a
:hello
iex> b
"world"
Enter fullscreen mode Exit fullscreen mode

Os dois lados (esquerdo e direto) devem ser do mesmo tipo, caso contrário um MatchError acontecerá, como no exemplo abaixo que tento fazer um match entre uma tupla e uma lista:

iex> {a, b, c} = [:hello, "world", 42]
** (MatchError) no match of right hand side value: [:hello, "world", 42]
Enter fullscreen mode Exit fullscreen mode

Para solucionar este problema, poderíamos fazer:

iex> [a, b, c] = [:hello, "world", 42]
[:hello, "world", 42]
iex> a
:hello
iex> b
"world"
iex> c
42
Enter fullscreen mode Exit fullscreen mode

Utilizar tamanhos diferentes entre os dois lados, também resultará em erro.

iex> [a, b] = [:hello, "world", "aloha"]    
** (MatchError) no match of right hand side value: [:hello, "world", "aloha"]
Enter fullscreen mode Exit fullscreen mode

Algumas vezes queremos mesmo ignorar certos valores em nosso matching, para isso o Elixir possui uma variável especial, que é o _. Essa variável nos possibilita ignorar certos valores em um pattern matching, ou seja, se quizermos ignorar o último elemento no matching entra as listas acima, poderíamos fazer da seguinte forma:

iex> [a, b, _] = [:hello, "world", "aloha"]
[:hello, "world", "aloha"]
iex> a
:hello
iex> b
"world"
Enter fullscreen mode Exit fullscreen mode

Pattern Matching vai além das variáveis, podemos utilizar isso com functions e muito mais, porém veremos como utilizar isto em um próximo post!

Top comments (1)

Collapse
 
pedrofmj profile image
Pedro Ferreira

Isso me lembra muito Prolog.